Html.EnumDropdownListFor: отображение текста по умолчанию

На мой взгляд, у меня есть enumdropdownlist (новая функция в Asp.Net MVC 5.1).

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

Если я выполню вышеуказанный код, я получаю dropdownlist для моего следующего перечисления.

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

но по умолчанию я хочу, чтобы мой dropdownlist имел значение (пользовательский текст) и это то, что я пробовал

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

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

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

Ответ 1

Попробуйте изменить Index LicenseTypes на начало с 1 not 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)

Ответ 2

К тому времени, когда ваш EnumDropDownListFor отображается SelectedLicense, уже имеет значение по умолчанию для типа 0.

Просто измените тип вашего свойства SelectedLicense на нулевое перечисление, например:

public LicenseTypes? SelectedLicense { get; set; }

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

Ответ 3

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

public enum Sex
{
    Male,
    Female
}

В моей модели у меня есть:

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

An в представлении:

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

Ответ 4

Класс 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>
}

Ответ 5

Я немного опоздал?

Изменение значений типа перечисления не очень удовлетворяет.

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

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

EDIT: Ah... newbies... Моя первая идея заключалась в использовании 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 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" , а не "Выберите свою музыку..."