Формат 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: изображение является скриншотом страницы при загрузке. По умолчанию он будет показывать пробную версию как выбранную опцию.

5 ответов


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

public LicenseTypes? SelectedLicense { get; set; }

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


у меня есть перечислимый:

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

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

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

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

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

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

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