如何在 ASP .NET MVC 3 中验证与另一字段相关的一个字段

2024-03-13

我有两个字段,例如电话号码和手机号码。就像是..

    [Required]
    public string Phone { get; set; }

    [Required]
    public string Mobile{ get; set; }

但用户可以在其中之一输入数据。一是强制性的。如何处理它们,即当用户在另一个字段中输入数据时如何禁用一个字段所需的字段验证器,反之亦然。在哪种情况下我必须在 javascript 中处理它以及我需要为此添加哪些脚本。任何人都可以帮忙找到解决方案吗...


一种可能性是编写自定义验证属性:

public class RequiredIfOtherFieldIsNullAttribute : ValidationAttribute, IClientValidatable
{
    private readonly string _otherProperty;
    public RequiredIfOtherFieldIsNullAttribute(string otherProperty)
    {
        _otherProperty = otherProperty;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var property = validationContext.ObjectType.GetProperty(_otherProperty);
        if (property == null)
        {
            return new ValidationResult(string.Format(
                CultureInfo.CurrentCulture, 
                "Unknown property {0}", 
                new[] { _otherProperty }
            ));
        }
        var otherPropertyValue = property.GetValue(validationContext.ObjectInstance, null);

        if (otherPropertyValue == null || otherPropertyValue as string == string.Empty)
        {
            if (value == null || value as string == string.Empty)
            {
                return new ValidationResult(string.Format(
                    CultureInfo.CurrentCulture,
                    FormatErrorMessage(validationContext.DisplayName),
                    new[] { _otherProperty }
                ));
            }
        }

        return null;
    }

    public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
    {
        var rule = new ModelClientValidationRule
        {
            ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()),
            ValidationType = "requiredif",
        };
        rule.ValidationParameters.Add("other", _otherProperty);
        yield return rule;
    }
}

您可以将其应用于视图模型的属性之一:

public class MyViewModel
{
    [RequiredIfOtherFieldIsNull("Mobile")]
    public string Phone { get; set; }

    public string Mobile { get; set; }
}

那么你可以有一个控制器:

public class HomeController : Controller
{
    public ActionResult Index()
    {
        return View(new MyViewModel());
    }

    [HttpPost]
    public ActionResult Index(MyViewModel model)
    {
        return View(model);
    }
}

最后是一个视图,您将在其中注册适配器以连接此自定义规则的客户端验证:

@model MyViewModel

<script src="@Url.Content("~/Scripts/jquery.validate.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.js")" type="text/javascript"></script>
<script type="text/javascript">
    jQuery.validator.unobtrusive.adapters.add(
        'requiredif', ['other'], function (options) {

            var getModelPrefix = function (fieldName) {
                return fieldName.substr(0, fieldName.lastIndexOf('.') + 1);
            }

            var appendModelPrefix = function (value, prefix) {
                if (value.indexOf('*.') === 0) {
                    value = value.replace('*.', prefix);
                }
                return value;
            }

            var prefix = getModelPrefix(options.element.name),
                other = options.params.other,
                fullOtherName = appendModelPrefix(other, prefix),
                element = $(options.form).find(':input[name="' + fullOtherName + '"]')[0];

            options.rules['requiredif'] = element;
            if (options.message) {
                options.messages['requiredif'] = options.message;
            }
        }
    );

    jQuery.validator.addMethod('requiredif', function (value, element, params) {
        var otherValue = $(params).val();
        if (otherValue != null && otherValue != '') {
            return true;
        }
        return value != null && value != '';
    }, '');
</script>

@using (Html.BeginForm())
{
    <div>
        @Html.LabelFor(x => x.Phone)
        @Html.EditorFor(x => x.Phone)
        @Html.ValidationMessageFor(x => x.Phone)
    </div>

    <div>
        @Html.LabelFor(x => x.Mobile)
        @Html.EditorFor(x => x.Mobile)
        @Html.ValidationMessageFor(x => x.Mobile)
    </div>

    <button type="submit">OK</button>
}

对于像我们在日常生活中遇到的验证规则这样极其简单的东西来说,这是相当恶心的东西。我不知道 ASP.NET MVC 的设计者在决定选择声明式验证方法而不是命令式验证方法时在想什么。

无论如何,这就是我使用的原因FluentValidation.NET http://fluentvalidation.codeplex.com/而不是数据注释来对我的模型执行验证。实现这种简单的验证场景的实现方式应该很简单。

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

如何在 ASP .NET MVC 3 中验证与另一字段相关的一个字段 的相关文章

  • 初始化字符串的格式不符合从索引 0 开始的规范

    我有一个 ASP Net MVC 应用程序 它在我的本地开发计算机上运行良好 但是部署到IIS7后尝试登录时出现以下错误 初始化字符串格式不符合规范 从索引 0 开始 大多数发布此错误的人通过以某种方式更改连接字符串来解决它 但是 我在本地
  • 将集合传递给 EditorFor() 时,它会为输入元素生成无效名称

    我有一个 BookCreateModel 其中包含书籍的平面信息 例如标题 出版年份等以及书籍作者的集合 复杂类型 public class BookCreateModel public string Title get set publi
  • mvc3 中的小数错误 - 该值对于字段无效

    我正在关注 ASP NET MVC 3 入门 1 我无法添加 编辑 Price 9 99 或 9 99 的值 它说 值 9 99 对 Price 无效 和 价格字段必须是数字 如何解决这个问题 Model public class Movi
  • 无法安装 MvcMailer

    我尝试通过在程序包管理器控制台中输入命令 Install Package MvcMailer 来安装 Mvc Mailer 但收到以下错误消息 Successfully installed MvcMailer 1 1 Successfull
  • MapSingleType错误

    我通过 MVC3 创建一个项目 并首先使用 EF Code 作为数据访问层 在我的数据库中我有PackaginInfo表 在项目中我关心包类 这是我的代码 public class Package public decimal Packag
  • 如何创建设置为太平洋标准时间午夜的 DateTimeOffset

    我正在使用 Quartz NET http quartznet sourceforge net http quartznet sourceforge net 我试图将开始日期设置在午夜 但我在创建这个日期时遇到问题 该应用程序将位于不同时区
  • 如何为Data-First自动创建的实体添加数据注释?

    如果模型优先 我们使用 MetadataType typeof ConceptMetadataSource 附加一个包含所有数据注释的 MetadataSource 文件 例如 HiddenInput DisplayValue false
  • System.ArgumentException:程序集中的重复类型名称

    我正在使用 EF 4 1 开发 ASP Net MVC 3 Web 应用程序 从今天开始 我收到此错误 System ArgumentException 程序集中的重复类型名称 我不知道是什么原因造成的 执行查找时 它发生在我的存储库中 p
  • 自定义 ViewEngine ASP.NET MVC 3

    我正在为 ASP NET MVC 的自定义视图引擎寻找最简单的解决方案 这样我就可以超越路径来寻找视图 实际上 我正在尝试在我的解决方案中构建一个主题系统 我查看了网络 但发现了很难学习和实施的解决方案 Thanks 这就是我用的 它在主题
  • MVC3 提交在我的复杂数据类型上返回 null

    在我的 MVC3 项目中 我有以下模型 public class CustomerModules public int ModuleId get set public string ModuleName get set public int
  • 如何在 MVC 3 Razor 中显示解码后的编码 HTML?

    我在 MVC 3 和 Asp net C 中使用 Razor 我有一个带有以下代码的视图 model ContentBody有一些 HTML 标签 我需要将此 HTML 内容显示为DECODED 我该如何更改视图中的代码 div class
  • 在asp.net mvc 3项目中渲染部分视图onclick

    在我的 mvc 项目中 我有一个简单的项目列表 其中包含如下的增删改查操作 tbody foreach var item in Model tr td item Title td td item Body td td item Price
  • mvc3,你能给控制器一个显示名称吗?

    我用的是mvc3 是否可以为控制器和操作指定显示名称 DisplayName Facebook Employee public class EmployeeController Controller 在我的面包屑中 我将获得控制器名称和操作
  • 如何重新包含排除的文件夹

    所以我只是无意中点击了我的项目的致命一击Exclude From Project代替Add在我的控制器文件夹中 当尝试添加名为 Controllers 的文件夹时 我收到错误 此文件夹存在 但是 如果我尝试单击该项目 gt Add Exis
  • asp.net mvc - Ajax 刷新视图的每个元素

    希望在退出 jquery 对话框后使用 ajax 刷新当前页面 我有一个包含 foreach 循环的视图 数据是从模型中提取的 每个循环有 2 个编辑 删除按钮 当我单击 编辑按钮 时 将打开一个 jquery UI 对话框进行编辑 当我保
  • .NET MVC - 一次提交相同类型的多个模型

    我认为我有一个非常简单的场景 但似乎无法掌握如何在 NET 的 MVC 框架中做到这一点 最简单地说 这是一种对人员进行排名的形式 我希望将每个人的姓名及其姓名旁边的文本框列在一页上 Razor Html 如下所示 using Html B
  • MVC3 和实体框架

    我的问题很简单 将 edmxMVC3 项目的 Web 应用程序的模型文件夹中的文件吗 我的答案非常简单 不要用数据访问逻辑和数据建模搞乱表示层 整个 MVC 应用程序 Visual Studio 解决方案中从下到上至少有 4 个项目 1 P
  • 用于 mvc3 日期格式和日期验证的文本框

    我决定开始使用 MVC 3 并且在尝试将我的一个 Web 应用程序重做为 MVC3 时遇到了这个问题 我的项目是这样设置的 public class Project public int ProjectID get set Required
  • Azure 网站中的 404 处理

    我在 Azure 上有一个 MVC 网站 我已经编写了一个控制器操作来代表资源 该操作应该返回 HTTP 404 但正文内容应该是一些 HTML 我在其中解释了 404 的原因 这是作为一个标准操作实现的 该操作设置Response Sta
  • 在代码 MVC Razor 中渲染部分视图

    我正在使用 MVC 3 Razor 制作一个简单的 CMS 以用于实践目的 我的想法是创建一些部分视图 我想要进行数据库查找 并发现 3 个部分视图需要渲染到页面 我该怎么做 在 WebForms 中 您可以调用 LoadControl C

随机推荐