数据注释触发Get方法的验证

时间:2015-09-25 14:06:16

标签: asp.net-mvc data-annotations

我有这个viewmodel

public class ProductViewModel : BaseViewModel
{
       public ProductViewModel()
       {
           Categories = new List<Categorie>
       }

       [Required(ErrorMessage = "*")]
       public int Code{ get; set; }

       [Required(ErrorMessage = "*")]
       public string Description{ get; set; }

       [Required(ErrorMessage = "*")]
       public int CategorieId { get; set; }

       public List<Categorie> Categories
}

我的控制器就像这样

[HttpGet]
public ActionResult Create(ProductViewModel model)
{
     model.Categories = //method to populate the list
     return View(model);
}

问题是,只要展示了视图,就会触发验证。

为什么会这样?

提前感谢您的帮助。

更新

视图就像这样

@using (Html.BeginForm("Create", "Product", FormMethod.Post, new { @class = "form-horizontal", @role = "form" }))
{


        <div class="form-group">
            <label for="Code" class="col-sm-2 control-label">Code*</label>
            <div class="col-sm-2">
                @Html.TextBoxFor(x => x.Code, new { @class = "form-control"})
            </div>
        </div>
        <div class="form-group">
            <label for="Description" class="col-sm-2 control-label">Desc*</label>
            <div class="col-sm-2">
                @Html.TextBoxFor(x => x.Description, new { @class = "form-control", maxlength = "50" })
            </div>
        </div>
            <div class="form-group">
                <label class="col-sm-2 control-label">Categorie*</label>
                <div class="col-sm-4">
                    @Html.DropDownListFor(x => x.CategorieId, Model.Categories, "Choose...", new { @class = "form-control" })
                </div>
            </div>

1 个答案:

答案 0 :(得分:1)

You GET方法有一个模型参数,这意味着DefaultModelBinder初始化模型的实例并根据路径值设置其属性。由于您没有传递任何值,因此所有属性值均为null,因为它们都具有[Required]属性,验证失败并且添加了ModelState错误,这就是为什么在视图中显示错误的原因首先渲染。

您不应该将模型用作GET方法中的参数。除了它创建的丑陋的查询字符串之外,对于所有属性(复杂对象和集合)的绑定都会失败(查看查询字符串 - 它包含&Categories=System.Collections.Generic.List<Categorie>当然会失败,属性Categories将是默认值空集合)。此外,您可以轻松地超出查询字符串限制并抛出异常。

如果您需要将值传递给GET方法,例如Code的值,则您的方法应为

[HttpGet]
public ActionResult Create(int code)
{
    ProductViewModel model = new ProductViewModel
    {
        Code = code,
        Categories = //method to populate the list
    };
    return View(model);
}