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

标签 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 规则违规,因此不会向我的用户显示任何消息。

处理这个问题有什么好方法吗?

最佳答案

您应该能够编写代码,例如...

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 {} block 并允许您验证模型。

关于asp.net-mvc - 如何使用 ASP.NET MVC 2 的数据注释验证最好地处理后期数据验证?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3792452/

相关文章:

laravel - Laravel 验证中避免使用小数

c# - 使用自定义 DataAnnotationsModelValidatorProvider 进行服务器端验证

jquery - 单个对象绑定(bind)但列表集合不绑定(bind)

c# - 如何使 requiredFieldValidator 在页面其他位置触发消息?

asp.net - 将旧版 url 映射到 MVC Controller 和操作

PHP - HTML 净化器 - 你好 w<o>rld/world 教程 striptags

.net - 使用 .Net MVC 3 在 ViewModel 中验证当前密码以更改密码的最佳实践?

c# - 我可以使用自定义验证属性手动验证属性吗?

c# - 如何将 sql server express 存储在与 UI 不同的项目中?

asp.net-mvc - IISExpress 上的 ASP.NET MVC 为每个请求重建整个站点