我有这个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>
答案 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);
}