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"})

но теперь проблема в том, что когда я его запускаю, мой выпадающий список выглядит такТаким образом, текст по умолчанию, который я хочу показать, не отображается по умолчанию. Если пользователь выбирает "выбрать лицензию" и пытается отправить форму, он отображает ошибку "выбрать лицензию", но не отображает текст по умолчанию. Что-то мне нужно изменить?

Ps: изображение это скриншот страницы при загрузке. По умолчанию будет отображаться пробная версия в качестве выбранной опции.

5 ответов

Решение

Попробуйте изменить Index из LicenseTypes начать с 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 свойство к обнуляемому перечислению, например так:

public LicenseTypes? SelectedLicense { get; set; }

Это также позволяет вам продолжать использовать Required атрибут, который я считаю значительно чище. Required Атрибут не допускает нулевой ответ, поэтому, даже если ваша модель допускает нулевые значения, форма не будет.

У меня есть перечисление:

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"})

Таким образом, у меня есть выпадающий список с опцией по умолчанию "Выбрать пол", но проверка допускает только опции, предоставленные enum ("Мужской" и "Женский").

В 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 не очень удовлетворительно.

Также не изменяется свойство модели, чтобы сделать его обнуляемым, а затем добавить атрибут [Обязательный], чтобы он не обнулялся.

Я предлагаю использовать ViewBag, чтобы установить выбранное по умолчанию значение раскрывающегося списка.Линия 4 контроллера, расположенная ниже, является единственной важной.

РЕДАКТИРОВАТЬ: Ах... новички... Моя первая идея состояла в том, чтобы использовать ModelState.SetModelValue, потому что мой инстинкт новичка не позволил мне просто попытаться установить желаемое значение в ViewBag, так как выпадающий список был привязан к модели. У меня была уверенность, что возникнет проблема: она будет привязана к свойству модели, а не к свойству 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" в действии "Индекс модели" значением по умолчанию будет "Металл", а не "Выбрать музыку..."

Другие вопросы по тегам