Asp.net mvc 如何最好地使用asp.net MVC 2';s数据注释验证?

Asp.net mvc 如何最好地使用asp.net MVC 2';s数据注释验证?,asp.net-mvc,validation,data-annotations,Asp.net Mvc,Validation,Data Annotations,典型情况下,发布到检查ModelState.IsValid的操作,如果是,则保存到DB。验证规则设置为模型中的数据注释 这是我的问题。我有一个不能超过400个字符的数据字段。数据注释强制执行这一点,并在客户端执行jQuery验证 用户输入395个字符,包括一些换行符。我的应用程序,将这些换行符转换为标记。但那是在调用UpdateModel()之后。由于标记比换行符长,它通过了UpdateModel的验证,但在实际尝试保存到DB时失败 基本上是这样的代码(来自NerdDinner): [HttpP

典型情况下,发布到检查ModelState.IsValid的操作,如果是,则保存到DB。验证规则设置为模型中的数据注释

这是我的问题。我有一个不能超过400个字符的数据字段。数据注释强制执行这一点,并在客户端执行jQuery验证

用户输入395个字符,包括一些换行符。我的应用程序,将这些换行符转换为

标记。但那是在调用
UpdateModel()
之后。由于

标记比换行符长,它通过了UpdateModel的验证,但在实际尝试保存到DB时失败

基本上是这样的代码(来自NerdDinner):

[HttpPost,授权]
公共操作结果编辑(int id,FormCollection集合){
晚餐=晚餐地点。获取晚餐(id);
试一试{
UpdateModel(晚餐,“晚餐”);
晚餐.Description=晚餐.Description.Replace(“\n”和“
”); //…现在它超过了长度限制 dinnerRepository.Save(); return RedirectToAction(“Details”,new{id=dinner.DinnerID}); } 抓住{ 返回视图(晚餐); } }
抛出异常时,不会填充数据注释中的ModelState规则冲突,因此不会向用户显示任何消息


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

您应该能够像

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);
if(TryUpdateModel(晚餐,“晚餐”)){
晚餐.Description=晚餐.Description.Replace(“\n”和“
”); //…现在它超过了长度限制 if(TryValidateModel(晚餐)){ dinnerRepository.Save(); return RedirectToAction(“Details”,new{id=dinner.DinnerID}); } } 返回视图(晚餐);

这将消除try{}块,并允许您验证您的模型。

哦,我不知道TryValidateModel,可以试一试。谢谢TryValidateModel很神奇!喜欢TryUpdateModel和TryValidateModel的流程。非常感谢!谢谢,看起来不错。我一定会调查的。
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);