Asp.net MVC 3 使用 DataAnnotations 进行条件验证

2023-11-22

我正在使用 Asp.net MVC 3,面临数据注释的验证问题,如下所示

我们在单独的库项目中维护模型,模型类层次结构如下

public class EditAlternateMailingAddressModel : BaseModel
{
    public UserAddressDetails AlternateAddressDetails { get; set; }

    public List<UsState> StateList { get; set; }        
}

现在 userAddressDetails 定义如下

 public partial class UserAddressDetails 
    {  
      public string DeliveryLine { get; set; }
      public string Zip { get; set; }
      public bool IsDefaultMailingAddress { get; set; }        
    }

验证逻辑在单独的类中定义,如下所示

[MetadataType(typeof(UserAddressDetailsMetaData))]
public partial class UserAddressDetails
{
    private class UserAddressDetailsMetaData
   {

      [Required(ErrorMessage = "Please enter address.")]
       public string DeliveryLine { get; set; }

       [Required(ErrorMessage = "Please enter city.")]
      public string City { get; set; }
        public bool IsDefaultMailingAddress { get; set; 
}

在编辑视图中,DeliveryLine、Zip 依赖于 IsDefaultMailingAddress,因为如果 IsDefaultMailingAddress 为 true,则必须提供这些字段,否则让表单提交。

为了打开和部分提交表单,我们使用 jQuery。

我们已经在下面尝试过http://andrewtwest.com/2011/01/10/conditional-validation-with-data-annotations-in-asp-net-mvc/ http://blogs.msdn.com/b/simonince/archive/2010/06/04/conditional-validation-in-mvc.aspx

但这些验证是在服务器端触发的,我们需要让它在客户端工作。


您应该创建自己的自定义 ValidationAttribute。如果您想要客户端验证,您的属性应该实现 IClientValidatable 接口,并且您应该编写自定义客户端验证器。

Updated:添加了代码示例

实施验证器:

public class CustomRequiredAttribute : ValidationAttribute, IClientValidatable
{
    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        // your validation logic here
        return ValidationResult.Success;
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules()
    {
        return new[] {new CustomRequiredValidationRule (ErrorMessage)};
    }
}

public class CustomRequiredValidationRule : ModelClientValidationRule
{
    public RequiredIfVisibleValidationRule(string errorMessage)
    {
        ValidationType = "customRequire";
        ErrorMessage = errorMessage;
    }
}

添加客户端验证器:

(function ($) {
    $.validator.addMethod('customRequire', function (value, element) {
        // your validation logic here
        return true; // true if valid, otherwise false 
    });
    $.validator.unobtrusive.adapters.add('customRequire');
})(jQuery);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Asp.net MVC 3 使用 DataAnnotations 进行条件验证 的相关文章

  • 将 Javascript 类数组传递给 MVC 控制器?

    我正在尝试将一系列服务传递给我的控制器 我尝试了很多不同的方法来让它工作 在进入控制器之前序列化数据 序列化每个服务 唯一有效的方法是将控制器参数更改为字符串并序列化数组 然后使用 JsonConvert 但我 d 宁愿不这样做 使用指定的
  • 无法使用 dataformatstring 格式化日期时间

    由于某种原因 我无法在网格视图中格式化日期文本
  • 使用 ITextsharp 将 Html 导出为 PDF

    我已经尝试了下面的代码 我也遇到了错误 我正在使用最新的 DLL String strSelectUserListBuilder h1 My First Heading h1 p My first paragraph p String ht
  • 如何正确链接不同View之间

    我有一个master cshtml带有导航栏 我的第一个链接是另一个视图 ProjectManagement li a href Views ProjectManagement cshtml Project Management a li
  • 将 NameValueCollection 绑定到 GridView?

    我应该使用哪种集合来将 NameValuecollection 转换为可绑定到 GridView 直接做的时候没效果 aspx cs 中的代码 private void BindList NameValueCollection nvpLis
  • OWIN中间件可以使用http会话吗?

    我有一些为 ASP NET 和 SignalR 复制的代码 我决定将其重写为 OWIN 中间件以删除这些重复 一旦我运行它 我注意到HttpContext Current Session为空 并且我没有看到任何会话对象IOwinContex
  • 错误:“无法在 Web 服务器上开始调试...”ASP.NET 4.0

    当我想在 IIS 服务器上创建网站时出现错误 我使用的是 Windows 7 和 Visual Studio 2010 我是否必须为 IIS 注册或配置 asp net 4 0 这里没有太多细节 但是当我尝试在刚刚从 3 5 更改为 4 0
  • 限制违反架构 - asp.net MVP

    如果我们在应用程序中定义了层次结构 对于前三层架构 我们如何限制后续开发人员违反规范 例如 在 MVP 不是 ASP NET MVC 架构的情况下 演示者应该始终绑定模型和视图 这有助于编写正确的单元测试程序 然而 我们也遇到过这样的情况
  • 从 .Net MVC 视图获取 HTML,而不在浏览器中实际渲染视图?

    我的控制器中有一个 ActionResult 我想从中发送 HTML 电子邮件 该电子邮件的正文是由视图生成的 我可以在传递模型时获取视图的结果并避免将其发送到浏览器 而不是在控制器中使用 2 个 actionresults 方法吗 Mvc
  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • 如何在 asp.net 网站中使用 aspnetdb 数据库

    我使用 asp net 3 5 创建了一个网站 现在我使用 Membership API 和 aspnetdb 数据库为其添加了会员支持 我已经在本地机器上完成了所有测试 现在 在将该站点上传到服务器时 需要考虑与 aspnetdb 有关的
  • 如何找到 IIS 在负载/性能测试期间模拟的平均并发用户数?

    我正在使用 JMeter 进行负载测试 我正在练习通过简单地增加我的分布式 JMeter 测试用例中的线程数并启动测试来查找我们的网络服务器可以处理的最大并发线程 用户 数量 然后 我突然意识到 虽然 MAX 数字可能有用 但REAL我的网
  • 如何根据 ASP.NET VNEXT MVC6 中给出的路径进行虚拟路由/重定向?

    我有一个网站 它在不同的路径上公开多个 API 每个 API 由特定于应用程序部分的控制器处理 例如example com Api Controller Action param1 stuff 其中控制器发生变化 但操作保持相当一致 我有几
  • 包括过滤器子集合[重复]

    这个问题在这里已经有答案了 我在为 LINQ 查询中包含的项目添加一些过滤条件时遇到一些困难 我的查询就像 var item Context Order Include Inner Include Inner first Include I
  • 带有 HttpContext 的 ASP.NET MVC 单元测试控制器

    我正在尝试为我的一个控制器编写一个单元测试 以验证视图是否正确返回 但该控制器有一个访问 HttpContext Current Session 的基本控制器 每次我创建控制器的新实例时 都会调用 basecontroller 构造函数 并
  • 从表单身份验证中排除页面 - ASP.NET

    我知道有两种方法可以从表单验证中排除页面 通过使用包含需要排除的页面的文件夹中的另一个 web config 文件 或者使用 location 元素
  • 古老的“字幕”标签的替代品?

    marquee 标签的标准等效项是什么 我正在寻找 HTML C asp NET 或 ASPX jquery java 脚本的解决方案 marquee 标签未包含在标准中 因为它是 视觉 标签 而不是 语义 标签 因此 您想要的任何语言都没
  • 使用 AJAX 加载部分视图不起作用

    请原谅我 我是 MVC 和 AJAX 的新手 目前我只是提交一个表单 我想使用表单中的数据使用 ajax 更新部分视图中的表 My UserInfo部分视图如下所示 model IEnumerable
  • mvc显示模板中当前项目的索引

    我有一个带有显示模板的 mvc 页面 如何获取显示模板中呈现的当前项目的索引 它在名称属性中产生正确的可绑定结果
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐