program story

Html.EnumDropdownListFor : 기본 텍스트 표시

inputbox 2020. 11. 26. 08:16
반응형

Html.EnumDropdownListFor : 기본 텍스트 표시


내 견해로는 enumdropdownlist (Asp.Net MVC 5.1의 새로운 기능)가 있습니다.

@Html.EnumDropDownListFor(m => m.SelectedLicense,new { @class="form-control"})

위의 코드를 실행하면 다음 열거 형에 대한 드롭 다운 목록이 표시됩니다.

public enum LicenseTypes
{
    Trial = 0,
    Paid = 1
}

하지만 기본적으로 내 드롭 다운 목록에 값 (사용자 지정 텍스트)이 있기를 원하며 이것이 제가 시도한 것입니다.

@Html.EnumDropDownListFor(m => m.SelectedLicense,"Select a license" ,new { @class="form-control"})

하지만 이제 문제는 내가 실행할 때 내 드롭 다운 목록이 다음과 같이 보입니다. 여기에 이미지 설명 입력따라서 표시하려는 기본 텍스트가 기본적으로 나타나지 않습니다. 사용자가 "라이선스 선택"을 선택하고 양식을 제출하려고하면 "라이선스 선택"이라는 오류가 표시되지만 기본 텍스트로 표시되지 않습니다. 변경해야 할 사항이 있습니까?

추신 : 이미지는로드 될 때 페이지의 스크린 샷입니다. 기본적으로 선택한 옵션으로 평가판이 표시됩니다.


변경 시도 IndexLicenseTypes에서 시작 1하지 0다음과 같은 :

public enum LicenseTypes
{
    Trial = 1,
    Paid = 2
}

그런 다음 Range attribute아래와 같이 선택한 라이선스 유형을 확인하는 데 사용할 수 있습니다 .

public class YourViewModel
{
     //Other properties
     [Range(1,int.MaxValue,ErrorMessage = "Select a correct license")]
     public LicenseTypes LicenseTypes { get; set; }
}

마지막으로, 귀하의 관점에서 :

   @Html.EnumDropDownListFor(m => m.LicenseTypes,"Select a license",new { @class = "form-control"})
   @Html.ValidationMessageFor(m => m.LicenseTypes)

EnumDropDownListFor렌더링 될 때까지 SelectedLicense이미 유형의 기본값 인 0.

다음과 같이 SelectedLicense속성 유형을 nullable 열거 형으로 변경하면됩니다 .

public LicenseTypes? SelectedLicense { get; set; }

이렇게하면 Required속성 을 계속 사용할 수 있습니다 . Required속성은 모델이 널 (NULL)을 허용 할 순간에도, 널 응답을 허용하지 않습니다, 양식이되지 않습니다.


열거 형이 있습니다.

public enum Sex
{
    Male,
    Female
}

내 모델에는 다음이 있습니다.

    [DisplayName("Sex")]
    [Required]
    public Sex? Sex { get; set; }

보기에서 :

    @Html.EnumDropDownListFor(model => model.Sex, "Select sex", new { @class = "form-control", type = "text"})

이것에 의해 기본 옵션 "섹스 선택"이있는 드롭 다운이 있지만 유효성 검사는 열거 형 ( "남성"및 "여성")에서 제공하는 옵션 만 허용합니다.

MVC3에서 (EnumDropDownListFor 제외) 모델에서 사용했습니다.

    [DisplayName("Sex")]
    [Required(AllowEmptyStrings=false)]
    public Sex? Sex { get; set; }

    Sex = null;

    Sexes = Repository.GetAutoSelectList<Sex>("");

보기 :

    @Html.DropDownListFor(model => model.Sex, Model.Sexes, new { @class = "form-control", type = "text" })

ViewModel 클래스는 enum 속성에 기본값이 설정되어 있어야 기본적으로 선택된 공용이됩니다.

public class Test
    {
        public Cars MyCars { get; set; }
        public enum Cars
        {
            [Display(Name = @"Car #1")]
            Car1 = 1,
            [Display(Name = @"Car #2")]
            Car2 = 2,
            [Display(Name = @"Car #3")]
            Car3 = 3
        }

    }

제어 장치:

 public class EnumController : Controller
    {
        // GET: Enum
        public ActionResult Index()
        {
            var model = new Test {MyCars = Test.Cars.Car3}; // set default value
            return View(model);
        }
        [HttpPost]
        public ActionResult Index(Test model)
        {
            .....
        }
    }

전망:

@Html.BeginForm()
{
<div class="panel bg-white">
    <div class="panel-header fg-white">
        Enums
    </div>
    <div class="panel-content">
        <div class="input-control select size3">
            @Html.EnumDropDownListFor(model => model.MyCars)

        </div>
    </div>
    <input type="submit" class="button success large" />
</div>
}

내가 조금 늦었나요?

enum 유형의 값을 변경하는 것은 그다지 만족스럽지 않습니다.

둘 다 모델 속성을 변경하여 null 허용으로 렌더링 한 다음 [Required] 특성을 추가하여 null 허용을 방지하지 않습니다.

ViewBag를 사용하여 드롭 다운의 기본 선택 값을 설정할 것을 제안합니다. 단지 아래에있는 컨트롤러의 라인 4만이 중요한 것입니다.

편집 : 아 ... 초보자 ... 내 첫 번째 아이디어는 드롭 다운이 모델에 바인딩되어 있기 때문에 초보자 본능으로 인해 ViewBag에서 원하는 값을 설정하려고 시도하기 때문에 ModelState.SetModelValue를 사용하는 것이 었습니다. 문제가 있다고 확신했습니다. ViewBag의 속성이 아니라 모델의 속성에 바인딩됩니다. 나는 모두 틀렸다 : ViewBag는 괜찮다. 코드를 수정했습니다.

여기에 예가 있습니다.

모델:

namespace WebApplication1.Models {

    public enum GoodMusic {
        Metal,
        HeavyMetal,
        PowerMetal,
        BlackMetal,
        ThashMetal,
        DeathMetal // . . .
    }

    public class Fan {
        [Required(ErrorMessage = "Don't be shy!")]
        public String Name { get; set; }
        [Required(ErrorMessage = "There's enough good music here for you to chose!")]
        public GoodMusic FavouriteMusic { get; set; }
    }
}

제어 장치:

namespace WebApplication1.Controllers {
    public class FanController : Controller {
        public ActionResult Index() {
            ViewBag.FavouriteMusic = string.Empty;
            //ModelState.SetModelValue( "FavouriteMusic", new ValueProviderResult( string.Empty, string.Empty, System.Globalization.CultureInfo.InvariantCulture ) );
            return View( "Index" );
        }
        [HttpPost, ActionName( "Index" )]
        public ActionResult Register( Models.Fan newFan ) {
            if( !ModelState.IsValid )
                return View( "Index" );
            ModelState.Clear();
            ViewBag.Message = "OK - You may register another fan";
            return Index();
        }
    }
}

전망:

@model WebApplication1.Models.Fan
<h2>Hello, fan</h2>
@using( Html.BeginForm() ) {
    <p>@Html.LabelFor( m => m.Name )</p>
    <p>@Html.EditorFor( m => m.Name ) @Html.ValidationMessageFor( m => m.Name )</p>
    <p>@Html.LabelFor( m => m.FavouriteMusic )</p>
    <p>@Html.EnumDropDownListFor( m => m.FavouriteMusic, "Chose your favorite music from here..." ) @Html.ValidationMessageFor( m => m.FavouriteMusic )</p>
    <input type="submit" value="Register" />
    @ViewBag.Message
}

모델 인덱스 작업에 "ModelState.SetModelValue 또는 ViewBag.FavouriteMusic = string.Empty"줄이 없으면 기본 선택 값은 "음악 선택 ..."이 아닌 "Metal"이됩니다.

참고 URL : https://stackoverflow.com/questions/21878673/html-enumdropdownlistfor-showing-a-default-text

반응형