Формат 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
}


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



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


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



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

669   5  

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 свойства, допускающего значение null типа enum, вот так:

public LicenseTypes? SelectedLicense { get; set; }

это также позволяет вам продолжать использовать Required атрибут, который я думаю, значительно чище. Элемент 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"})

при этом у меня есть выпадающий список с опцией по умолчанию "выбрать пол", но проверка принимает только параметры, предоставляемые 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)
        {
            .....
        }
    }

View:

@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();
        }
    }
}

View:

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

Comments

    Ничего не найдено.