我刚刚完成了我的第一个asp.net mvc网站,但我对验证的稳健性不满意。
我读了验证,然后将以下代码添加到我的UsersController中的Edit操作:
if (user_.firstname.Trim().Length == 0)
{
ModelState.AddModelError("firstname", "First Name is required.");
return View();
}
我刚刚对此进行了测试,我现在在模型为空的视图中出现错误。
<% using (Html.BeginForm())
{%>
<fieldset>
<legend>Fields</legend>
<p>
<label for="Email">
Login Name:
<%= Model.loginName%>
</label>
</p>
<p>
所以在上面的Model中是null,所以我在Model.loginName上得到了一个异常。任何想法发生在这里。如果我删除上面的代码(验证)一切正常。 (除了我可以把垃圾放在我的数据库中。
答案 0 :(得分:4)
请参阅我对类似主题的回应。
Validating form using ModelState
每次向ModelState添加模型错误并再次调用View时,asp.net MVC框架都会尝试查找尝试的值。此外,您的View应该将user_对象返回到强类型视图。
if (user_.firstname.Trim().Length == 0)
{
ModelState.AddModelError("firstname", "First Name is required.");
ModelState.SetModelValue("firstname", ValueProvider["firstname"]);
return View(user_);
}
答案 1 :(得分:1)
你得到一个模型null错误,因为你没有将模型传递给视图......是否有什么阻止你这样做?
E.g。
if (user_.firstname.Trim().Length == 0)
{
ModelState.AddModelError("firstname", "First Name is required.");
return View(user_);
}
虽然这应该可以解决...你应该真正了解验证的工作原理。验证应该在控制器以外的其他地方进行,例如,我将所有验证都放在模型本身中。
答案 2 :(得分:1)
我在返回方法中添加了模型,现在它开始工作了。
感谢您的回答。
返回视图(contactToEdit);
答案 3 :(得分:0)
在您的控制器中,您应该添加重载方法:
public ViewResult UpdateUser()
{
return View();
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult UpdateUser(user data)
{
if (user_.firstname.Trim().Length == 0)
{
ModelState.AddModelError("firstname", "First Name is required.");
return View();
}
return View();
}
使用此解决方案,第二种方法中的模型不会为空