ASP.net MVC3 DropDownListFor int必需的DataAnnotation

时间:2011-12-18 07:04:04

标签: asp.net-mvc asp.net-mvc-3 entity-framework entity-framework-4 data-annotations

有没有办法触发DropDownListFor创建的选择列表的客户端验证?帮助程序创建的选择列表似乎没有得到文本输入为客户端验证获得的“data-val”或“data-val-required”属性。

当我检查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);
}

我已经尝试过的事情:

  • 使View Model的CountryId属性成为可以为空的int(int?)
  • 删除CountryId属性的Range属性
  • 将ViewBag.CountryId重命名为其他内容(如果与View Model的属性名称存在某些冲突)

我可以轻松地使用jQuery创建所需的值,但我想确保我不会忽略已经内置的内容;特别是在我走的路上,我想添加本地化的文化错误消息。

0 个答案:

没有答案