典型情况,发布到检查ModelState.IsValid的操作,如果是,则保存到数据库。验证规则在模型中设置为数据注释。
这是我的问题。我有一个不能超过400个字符的数据字段。数据注释强制执行此操作,以及客户端的jQuery验证。
用户输入395个字符,包括几个换行符。我的应用将这些换行符转换为<br />
标记。但那是在调用UpdateModel()
之后。由于<br />
标记比新行更长,因此它会在UpdateModel上传递验证,但在实际尝试保存到数据库时会失败。
代码基本上是这样的(来自NerdDinner):
[HttpPost, Authorize]
public ActionResult Edit(int id, FormCollection collection) {
Dinner dinner = dinnerRepository.GetDinner(id);
try {
UpdateModel(dinner, "Dinner");
dinner.Description = dinner.Description.Replace("\n", "<br />");
//... now it's over length limit
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
catch {
return View(dinner);
}
}
抛出异常时,不会填充数据注释中的ModelState规则冲突,因此不会向我的用户显示任何消息。
处理此问题的好方法是什么?
答案 0 :(得分:3)
你应该能够编写代码......
if (TryUpdateModel(dinner, "Dinner")) {
dinner.Description = dinner.Description.Replace("\n", "<br />");
//... now it's over length limit
if (TryValidateModel(dinner)) {
dinnerRepository.Save();
return RedirectToAction("Details", new { id=dinner.DinnerID });
}
}
return View(dinner);
这摆脱了try {}块,并允许您验证模型。
答案 1 :(得分:2)