使用asp.net MVC 2的数据注释验证如何最好地处理后期数据验证?

时间:2010-09-25 04:07:07

标签: asp.net-mvc validation data-annotations

典型情况,发布到检查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规则冲突,因此不会向我的用户显示任何消息。

处理此问题的好方法是什么?

2 个答案:

答案 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)