0

有触发客户端验证通过DropDownListFor创建的选择列表的方法吗?由助手创建的选择列表似乎没有获得文本输入获得的用于客户端验证的“data-val”或“data-val-required”属性。ASP.net MVC3 DropDownListFor INT要求DataAnnotation

验证并在服务器侧出现当我检查ModelState.IsValid,然后对后续页面加载显示的验证消息。

我就行了,因为我希望用户必须选择一个选项(而不是让它在列表中选择第一项)中设置的默认选项“请选择...”。

我的视图模型:

public partial class ProvinceVM 
{ 
    [Required] 
    [Range(1, int.MaxValue)] 
    public int CountryId { get; set; } 
    [Required] 
    [StringLength(16)] 
    public string Abbreviation { get; set; } 
    [Required] 
    [StringLength(64)] 
    public string Name { get; set; } 
} 

在查看代码:

<div class="editor-label"> 
    @Html.LabelFor(model => model.CountryId, "Country") 
</div> 
<div class="editor-field"> 
    @Html.DropDownListFor(model => model.CountryId, (IEnumerable<SelectListItem>)ViewBag.CountryId, "Please Select...") 
    @Html.ValidationMessageFor(model => model.CountryId) 
</div> 

我的控制器代码:

[HttpPost] 
public ActionResult Create(ProvinceEditVM provinceVM) 
{ 
    if (ModelState.IsValid) 
    { 
     var province = new Province() { CountryId = provinceVM.CountryId.Value, Abbreviation = provinceVM.Abbreviation, Name = provinceVM.Name }; 
     _repo.Add<Province>(province); 
     _repo.SaveChanges(); 
     return RedirectToAction("index"); 
    } 
    ViewBag.CountryId = new SelectList(_repo.GetQuery<Country>().OrderBy(x => x.Name), "CountryId", "Name", provinceVM.CountryId); 
    return View(provinceVM); 
} 

事情我已经尝试:

  • 使视图模型的CountryId属性可空INT(INT?)
  • 拆除范围属性为CountryId财产
  • 重命名ViewBag.CountryId别的东西(如果存在与视图模型的属性名有些冲突)

我可以很容易地使用jQuery创建所需的值,但我想确保我不会忽略已经内置的东西;特别是因为更进一步,我想添加本地化的文化错误消息。

回答

1

居然能得到它的工作做的我在帖子的末尾提到的所有三件事情的组合。使视图模型的属性可以为空,必需,并且必须将ViewBage.CountryId重命名为其他内容(我将其重命名为CountryList)。

我想通了通过添加的SelectList属性我ProvinceVM把它弄出来的ViewBag的,然后突然的数据-VAL *属性被显示在列表上起来。

1

这是dropdownlists不显眼验证的错误。 MVC 3 RTM不会为一组下拉列表创建不显眼的验证。见http://aspnet.codeplex.com/workitem/7629。问题是构建不显眼验证的代码在不引用元数据的情况下进行调用,从而导致它返回空值。解决方案是为DropDownListFor构建您自己的HtmlHelper。

看那附带的zip文件的解决方法,

+0

感谢您指出了这一点。 – Sam 2011-12-18 07:27:04