我试图排除一个必需的属性(密码),因此模型状态不会验证该属性,但由于某种原因,即使我尝试排除它,它仍然会验证.
控制器:
[Authorize,AcceptVerbs(HttpVerbs.Post)] public ActionResult _Edit(int id,[Bind(Exclude = "Password")]FormCollection collection) { var user = Proxy.GetUser(id); TryUpdateModel(user,null,new[]{"Password"}); if(!ModelState.IsValid) return PartialView(user); Proxy.UpdateUser(user); }
视图:
... <tr> <td class="label"> <label class="row_description" for="Password"><%= S._("Password")%></label> </td> <td> <%= Html.Password("Password",new { @class = "row_input" })%> <%= Html.ValidationMessage("Password","*")%> </td> </tr>
用户(使用dataannotation):
[required] public string Password { get; set; }
我使用的是VS2008,MVC2,firefox
也许我只是累了,看不到它.任何帮助表示赞赏
解决方法
我目前遇到与MVC3类似的问题.
尽管我的Action中有[Bind(Exclude =“Password”)],但ModelState.IsValid仍然返回false.
我注意到TryUpdateModel(user,new string [] {“Password”});成功更新模型;但仍然是假的.然后我发现(在stackoverflow的某个地方,抱歉没有链接),TryUpdateModel实际上返回了ModelState.IsValid.
因此,问题不在于TryUpdateModel,而在于ModelState.IsValid.
注意:这也意味着您不需要两次验证…您可以使用此代码:
if (!TryUpdateModel(user,new string[]{"Password"})) return PartialView(user);
因此,问题似乎是ModelState仍在验证已从FormCollection中排除的属性.
我能够通过在调用TryUpdateModel之前从ModelState中删除字段来克服这个问题:
ModelState.Remove("Password");