This Question是类似的,但接受的答案解决了服务器端,我对客户端解决方案感兴趣.
鉴于此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; } }
和剃刀
<div> @Html.LabelFor(model => model.SomeChoice,new { @class = "label" }) @Html.DropDownListFor(model => model.SomeChoice,(SelectList)ViewBag.SomeChoice,"Select...") @Html.ValidationMessageFor(model => model.SomeChoice) </div>
并假设ViewBag.SomeChoice包含一个选择的选择列表
渲染的html没有得到data-val =“true”data-val-required =“我要求你做出选择!”其中的属性如@ Html.EditorFor(model => model.Keyword)或@ Html.TextBoxFor将呈现.
为什么?
@Html.DropDownListFor(model => model.SomeChoice,"Select...",new { @class = "required" })
它使用jQuery Validation类语义和块提交但不显示消息.我可以做这种事
@Html.DropDownListFor(model => model.SomeChoice,new Dictionary<string,object> { { "data-val","true" },{ "data-val-required","I DEMAND YOU MAKE A CHOICE!" } })
哪个会在那里放置正确的属性,并在提交时阻止并显示消息但不利用我在viewmodel上的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 <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> @using (Html.BeginForm()) { <div> @Html.LabelFor(model => model.SomeChoice) @Html.DropDownListFor(model => model.SomeChoice,"Select...") @Html.ValidationMessageFor(model => model.SomeChoice) </div> <button type="submit">OK</button> }
这是渲染的代码
<form action="/Home/About" method="post"> <div> <label for="SomeChoice">Some Choice</label> <select id="SomeChoice" name="SomeChoice"><option value="">Select...</option> <option value="1">A</option> <option value="2">B</option> <option value="3">C</option> </select> <span class="field-validation-valid" data-valmsg-for="SomeChoice" data-valmsg-replace="true"> </span> </div> <button type="submit">OK</button> </form>
它回发给我的控制器……这不应该发生
解决方法
只需在要绑定下拉列表的属性上使用可为空的整数,就可以在视图模型上使用:
[required(ErrorMessage = "I DEMAND YOU MAKE A CHOICE!")] [Display(Name = "Some Choice")] public int? SomeChoice { get; set; }
另外,为了获得适当不引人注目的HTML5 data- *属性,下拉列表必须位于表单内:
@model Myviewmodel <script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script> <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script> @using (Html.BeginForm()) { <div> @Html.LabelFor(model => model.SomeChoice,new { @class = "label" }) @Html.DropDownListFor( model => model.SomeChoice,Model.ListOfChoices,"Select..." ) @Html.ValidationMessageFor(model => model.SomeChoice) </div> <button type="submit">OK</button> }
另外你会注意到我摆脱了ViewBag(我根本无法忍受)并用视图模型上的相应属性替换它,它将包含下拉列表的可能选项.