Этот вопрос похож, но принятый ответ решает его на стороне сервера, меня интересуют решения на стороне клиента.
Учитывая эту ViewModel
public class MyViewModel
{
public string ID { get; set; }
[Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
[Display(Name = "Some Choice")]
public int SomeChoice{ get; set; }
[Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
[Display(Name = "Keyword")]
public string Keyword { get; set; }
}
и бритву
@Html.LabelFor(model => model.SomeChoice, new { @class = "label" })
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...")
@Html.ValidationMessageFor(model => model.SomeChoice)
и предположим, что ViewBag.SomeChoice содержит список выбора
Визуализированный HTML-код не получает data-val = "true" data-val-required = "ТРЕБУЮ ВАС СДЕЛАТЬ ВЫБОР!" такие атрибуты, как @ Html.EditorFor (model => model.Keyword) или @ Html.TextBoxFor.
ПОЧЕМУ?
Добавление к нему class = "required"
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new { @class = "required" })
, которое использует семантику класса проверки jQuery и блокирует отправку, но не отображает сообщение. Я могу делать такие вещи
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...", new Dictionary { { "data-val", "true" }, { "data-val-required", "I DEMAND YOU MAKE A CHOICE!" } })
, которые помещают туда правильные атрибуты, блокируют отправку и показывают сообщение, но не используют в своих интересах RequiredAttribute ErrorMessage, которое у меня есть в моей модели просмотра
Так что кто-нибудь написал DropDownListFor который ведет себя как другие HtmlHelpers в отношении проверки?
РЕДАКТИРОВАТЬ Вот мой ТОЧНЫЙ код
в HomeController.cs
public class MyViewModel
{
[Required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")]
[Display(Name = "Some Choice")]
public int? SomeChoice { get; set; }
}
public ActionResult About()
{
var items = new[] { new SelectListItem { Text = "A", Value = "1" }, new SelectListItem { Text = "B", Value = "2" }, new SelectListItem { Text = "C", Value = "3" }, };
ViewBag.SomeChoice = new SelectList(items,"Value", "Text");
ViewData.Model = new MyViewModel {};
return View();
}
About.cshtml
@using Arc.Portal.Web.Host.Controllers
@model MyViewModel
@using (Html.BeginForm())
{
@Html.LabelFor(model => model.SomeChoice)
@Html.DropDownListFor(model => model.SomeChoice, (SelectList)ViewBag.SomeChoice, "Select...")
@Html.ValidationMessageFor(model => model.SomeChoice)
}
А вот визуализированный код
Он отправляет обратно в мой контроллер ... этого не должно происходить