ASP.NET MVC 中 ViewModel 验证的最佳实践

2024-03-26

我在用DataAnnotations验证我的ViewModel在客户端jquery.validate.unobtrusive并在服务器端ASP.NET MVC应用。

不久前,我发现我可以这样编写验证:

[Required(ErrorMessage = "{0} is required")]
public string Name { get; set; }

这样我就可以轻松地定义一些通用字符串config或在资源中并始终使用它DataAnnotations。因此,将来在我的整个应用程序中更改验证消息会更容易。

我还知道有一个流利验证允许向已有规则添加验证规则的库ViewModel。我知道添加/编辑有问题ViewModels可以具有相似的字段但不同的验证规则。

来自客户端验证的另一个问题是新添加的 htmlDOM (using 阿贾克斯请求) 应进行解析以启用验证。我就是这样做的:

$('#some-ajax-form').data('validator', null); 
$.validator.unobtrusive.parse('#some-ajax-form');

所以我有一些问题:

  1. 是否有一些其他有用的实践可以帮助集中应用程序中的所有验证规则?
  2. 解决添加/编辑问题的最佳方法是什么ViewModel验证问题?我可以用吗DataAnnotations with 流利验证或单独添加和编辑ViewModels仍然是最好的选择吗?
  3. 有没有更好的方法来初始化新的验证DOM收到的元素阿贾克斯调用其他我提到的?

我不是问如何创建自己的DataValidators我知道该怎么做。我正在寻找如何以更高效且易于维护的方式使用它们的方法。


首先回答你的第三个问题:不,没有比你正在做的事情更简单的方法了。只需两行代码即可使其正常工作,这再简单不过了。尽管有一个您可以使用的插件,就像问题中所解释的那样不引人注目的验证不适用于动态内容 https://stackoverflow.com/a/14982495/434949

你的第一个问题,如何集中验证,我通常使用一个单独的类文件来存储我所有的验证规则。这样我就不必浏览每个类文件来查找规则,而是将它们全部放在一个位置。如果这样更好,那就是选择的问题了。我开始使用它的主要原因是能够向自动生成的类(例如实体框架中的类)添加验证。

所以我有一个名为ModelValidation.cs在我的数据层中,并且有我所有模型的代码,例如

/// <summary>
/// Validation rules for the <see cref="Test"/> object
/// </summary>
/// <remarks>
/// 2015-01-26: Created
/// </remarks>
[MetadataType(typeof(TestValidation))]
public partial class Test { }
public class TestValidation
{
    /// <summary>Name is required</summary>
    [Required]
    [StringLength(100)]
    public string Name { get; set; }

    /// <summary>Text is multiline</summary>
    [DataType(DataType.MultilineText)]
    [AllowHtml]
    public string Text { get; set; }
}

现在,正如您所注意到的,我没有提供实际的错误消息。我用Haacked 的约定 http://haacked.com/archive/2011/07/14/model-metadata-and-validation-localization-using-conventions.aspx/添加消息。它使得添加本地化验证规则变得简单。

它基本上归结为包含以下内容的资源文件:

Test_Name = "Provide name"
Test_Name_Required = "Name is required"

当您拨打常规电话时,将使用这些消息和命名MVC view代码就像

<div class="editor-container">
    <div class="editor-label">
        @Html.LabelFor(model => model.Name) <!--"Provide name"-->
    </div>
    <div class="editor-field">
        @Html.EditorFor(model => model.Name)
        @Html.ValidationMessageFor(model => model.Name) <!--"Name is required"-->
    </div>
</div>

您的第二个问题,关于添加/编辑的不同验证可以通过两种方式处理。最好的方法是按照实际意图使用视图。这意味着您不会将实际模型传递给视图,而是创建一个仅包含数据的视图模型。所以你有一个视图模型Create具有适当的验证规则和视图模型Edit使用适当的规则,当它们通过时,您将结果插入到实际模型中。 然而,这需要更多的代码和手动工作,所以我可以想象你并不是真的愿意这样做。

另一种选择是使用条件验证 https://stackoverflow.com/a/5285348/434949就像 viperguynaz 所解释的那样。现在,我的类需要在编辑/添加之间进行更改,而不是布尔值,而是有一个primary key Id int。所以我检查是否Id>0以确定它是否是编辑。

UPDATE:

如果你想更新每个 ajax 调用的验证,你可以使用jQuery ajaxComplete。这将在每次 ajax 请求后重新验证所有表单。

$( document ).ajaxComplete(function() {
    $('form').each(function() {
        var $el = $(this);
        $el.data('validator', null); 
        $.validator.unobtrusive.parse($el);
    })
});

如果这是您想要的,取决于您通过以下方式收到表格的频率AJAX。如果你有很多AJAX请求,例如每 10 秒轮询一次状态,那么您就不需要这样。如果你偶尔有AJAXrequest,主要包含一个表单,那么你就可以使用它。

If your AJAX返回您想要验证的表单,那么是的,更新验证是一个很好的做法。但我想更好的问题是“我真的需要通过 AJAX 发送表单吗?”AJAX有趣且有用,但应谨慎使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ASP.NET MVC 中 ViewModel 验证的最佳实践 的相关文章

随机推荐

  • 如何枚举 USB 设备*并*对其进行读/写?

    我需要与一个自定义 USB 设备进行通信 它没有特定的驱动程序 该设备不显示为 dev tty I 发现 http www signal11 us oss udev 我该如何使用libudev枚举 USB 设备 假设我设法获得相应的stru
  • Java 中的克隆

    我在网上读到一段关于克隆的内容 但我不太明白 所以有人能解释清楚吗 如果类具有 Final 字段 则无法在克隆方法中为这些字段赋予值 这会导致正确初始化对象的最终字段出现问题 如果最终字段引用对象的某些内部状态 则克隆的对象最终会共享内部状
  • 恢复分页库 3 中的滚动位置

    我将 Paging Library 3 与 RemoteMediator 一起使用 其中包括从网络和本地 Room 数据库加载数据 每次我滚动到 RecyclerView 中的某个位置 导航到另一个片段 然后导航回带有列表的片段时 滚动状态
  • LibGDX 。绘制多行文本

    我正在尝试使用 libGDX 中的 BitmapFont 编写大文本 但它显示在一行上 用户只能看到文本的第一部分 如何使 bitmapFont 自动换行并在屏幕上显示整个文本 要么使用 n用于手动换行并通过渲染字体font drawMul
  • Node 和 Express:如何实现基本的 webhook 服务器

    我很难找到教程 我是 webhooks 的新手 除了对它们应该如何工作的一些基本描述之外 还没有使用或见过它们 我们的用例是在有新记录时更新 API 的用户 由于我们使用 Kafka 并已确定 最终一致性 因此另一个用途可能是在无法从 Ka
  • ListView 行标记 ala GMail

    我有兴趣创建一个 ListView 其中每一行都按照 GMail 3 0 中的方式进行标记 这会很好地分离左右 ListFragment 其他示例还包括 2 3 4 上的 Google 日历 例如颜色标记位于 ListView 的左侧 请参
  • 如何在带有 Boost Spirit 的 AST 中使用只有一个属性的类?

    我想使用 Boost Spirit 将文件解析为 AST 我的 AST 的根源是一个只有一个属性的类 typedef boost variant
  • 根据搜索条件查找列名和行名

    我有以下 Excel 电子表格 A B C D E F G 1 Q1 Q2 Q3 Q4 Search criteria 60 2 Asset 1 15 85 90 70 Column name Q4 3 Asset 2 40 80 45 6
  • Laravel getQueryString() 不带 &

    我正在尝试将包含部分 URL 的变量输出到我的页面上的 Javascript 中 当我这样做时 它会改变任何 into amp 这会破坏 URL 我尝试过使用str replace html entity decode htmlspecia
  • 如何使 C# Powershell Invoke 成员线程安全

    我有这项服务 当收到请求时 运行 powershell 命令并返回结果 这是调用者类代码 public class PowerShellScript public PowerShellScript public Object Invoke
  • 如何在面向 python 2.5.1 的项目目录中包含和使用 .eggs/pkg_resources

    我有 python egg 文件 它们存储在某些 py 代码的相对位置 问题是 我的目标是 python 2 5 1 计算机 这要求我的项目自包含在一个文件夹中 数十万台运行 Sugar 的 OLPC XO 8 2 1 版本笔记本电脑 这意
  • 将 Java Web 应用程序与 SAML SSO 集成

    我有一个 Restful Java Web 应用程序 将部署到许多不同的环境 在我的控制范围之外 这些环境将使用 SAML 2 0 SSO 解决方案 我的应用程序 我认为是 服务提供商 需要存储用户生成的状态 并使用内部业务逻辑来确定允许哪
  • 管理MapView的缓存

    我制作了一个基于 Google Maps API 的应用程序 问题是我的应用程序是为了在野外 没有网络的地方使用而设计的 因此 我想管理缓存 以确保在旅途中保存特定的图块并可用 我想在数据库中重定向它们 但任何方法都可以 目前 除了尝试重新
  • Facebook Javascript SDK:getLoginStatus 没有响应

    按照指示这一页 https developers facebook com docs javascript quickstart v2 5 我将 SDK 片段包含到我的页面中 但由于我没有任何 Facebook 应用程序 并且我只是尝试在我
  • Jest 和 Webpack - 意外的令牌导入

    我很难设置我的测试套件 我有一个 React Redux Webpack 项目 正在尝试添加 Jest 我可以运行测试 但是我无法import任何东西到我的测试文件中 例如 当尝试导入我的 redux 操作时 我收到以下错误 Users n
  • 如何在 Android 中处理来电后从之前的状态恢复 Activity?

    我正在创建从服务器下载 4 5 张图像并显示为图库的应用程序 在正常情况下工作正常 但是当有来电或设备处于睡眠模式时 我的活动从 onResume 之后开始加载数据 我无法从以前的活动状态加载数据 恢复活动 有什么解决办法吗 Thanks
  • 从文本块中提取电子邮件地址

    如何创建包含在文本块中的电子邮件地址数组 我试过了 addrs text scan map e e 1 1 但 毫不奇怪 它不能可靠地工作 对于一个 稍微 更好的正则表达式怎么样 b A Z0 9 A Z0 9 A Z 2 4 b 你可以在
  • 将 Python PuDB 调试器与 pytest 结合使用

    在我选择的测试库之前unittest 它与我最喜欢的调试器 PuDB 一起工作 不是PDB 使用 PuDB 与unittest 我粘贴import pudb pudb set trace 代码行之间 然后我执行了python m unitt
  • 使用直接显示从 DVD 抓取图像

    有人知道使用 DirectShow 和 C 从 DVD 抓取图像的方法吗 使用 DVD 渲染器时不支持样本采集器 并且如果我使用 GetCurrentImage VMR9 无窗口控件的一部分 它似乎不起作用 查看 directshow 示例
  • ASP.NET MVC 中 ViewModel 验证的最佳实践

    我在用DataAnnotations验证我的ViewModel在客户端jquery validate unobtrusive并在服务器端ASP NET MVC应用 不久前 我发现我可以这样编写验证 Required ErrorMessage