MVC4 & IClientValidatable - 自动 AJAX 调用服务器端验证

2023-12-12

我正在寻找在 MVC4 中实现自定义客户端验证。我目前让它与标准属性配合得很好,例如我的模型中的这个

public class UploadedFiles
{
    [StringLength(255, ErrorMessage = "Path is too long.")]
    [Required(ErrorMessage = "Path cannot be empty.")]
    [ValidPath]
    public string SourceDirectory { get; set; }
}

因此 StringLength 和 required 都会自动转换为一些 JQuery 客户端验证。目前“有效路径”仅适用于服务器端。验证始终需要在服务器端进行,因为只有服务器可以验证路径是否有效,您不能在客户端执行此操作。

服务器端代码如下

public class ValidPathAttribute : ValidationAttribute, IClientValidatable
{
    public string SourceDirectory;

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        string path = value.ToString();
        string message = string.Empty;

        var fileSystemSupport = new FileSystemSupport(Settings, new WrappedFileSystem(new FileSystem()));

        if (fileSystemSupport.ValidateNetworkPath(path, out message))
        {
            return ValidationResult.Success;
        }

        return new ValidationResult(message);
    }
} 

这很好用。现在我希望通过 ajax 调用来实现这一点,进入“IClientValidatable”和“GetClient ValidationRules”。继我写的书之后

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

我相信我现在必须编写一些自定义验证脚本代码、适配器(用于识别所需的元数据)和验证规则本身(验证器,由rule.ValidationType引用)。

我认为我不需要编写适配器,我可以使用

addBool- 为“打开”或“关闭”的验证器规则创建适配器。该规则不需要额外的参数

所以在 UploadedFiles.js 我现在有

$.validator.unobtrusive.adapters.addBool("validpath", "required");

在我看来

@section Scripts {
    @Scripts.Render("~/bundles/jqueryval")
    @Scripts.Render("~/Scripts/UploadedFiles.js")
}

I believe这足以连接所有内容,但我现在需要编写 javascript 验证器。它们位于 jQuery.validator 对象中,可以使用 $.validator.addMethod 添加。

由于以下几个原因,这就是我有点困惑的地方:

1)这是正确的处理方式吗?如果我的验证位于服务器端,那么这是一个ajax调用吗?这需要同步。

2)是否有一个我应该重用的 jQuery 元素来做到这一点?我希望既然我已经完成了服务器端的工作,我可以启用一些魔法来将客户端连接到它(就像标准验证一样)。

3)我希望它可以在各种自定义验证属性中重复使用。我怎样才能使这个通用?

如果我把鼹鼠山变成一座山,我很抱歉。谢谢你的时间 :)

Russ


MVC 附带RemoteAttribute它在内部对控制器方法进行 ajax 调用,该方法返回一个 Json 值,指示验证是否成功或失败

public JsonResult IsValid(string SourceDirectory)
{
  if (someCondition) //test if the value of SourceDirectory is valid
  {
    return Json(true, JsonRequestBehavior.AllowGet); // indicates its valid
  }
  else
  {
    return Json(false, JsonRequestBehavior.AllowGet); // indicates its not valid
    // or return Json("A custom error message that overrides the default message defined in the attribute");
  }
}

并用以下装饰您的财产

[Remote("IsValid", "YourController", ErrorMessage = "The path is not valid")]
public string SourceDirectory { get; set; }

注:RemoteAttribute仅适用于客户端(jquery 不引人注目的验证),您可能仍然需要额外的服务器端验证。

Refer 如何:在 ASP.NET MVC 中实现远程验证详细示例

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

MVC4 & IClientValidatable - 自动 AJAX 调用服务器端验证 的相关文章

随机推荐

  • 如何从servlet调用JavaScript函数

    我是网络开发新手 我有一个外部 JavaScript 文件 其中包含一个要显示的函数 包含错误详细信息的提示 我需要将错误消息传递给函数 我已经在servlet中编写了控制器 如何从我的 servlet 调用该 JavaScript 文件的
  • 处理退出状态 popen python

    我试图用 popen 处理状态退出 但它给出了一个错误 代码是 import os try res os popen ping c 4 www google com except IOError print ISPerror popen t
  • 奇怪的单元格地址非连续范围的行为:VBA

    我试图回答这个问题当我在 Excel 中遇到一些奇怪的 VBA 行为时 我写了一个非常简单的子程序来演示这个问题 Sub debugAddresses rng As Range Debug Print Whole range rng Add
  • 从 Android 中的通知开始新活动

    我想从状态栏通知启动一个活动 A 当活动 A 已经在前面时 我想完成该活动并重新启动活动 A 我该怎么做 查看有关创建状态栏通知的文档 这绝对涵盖了使用 Intent 和 PendingIntent 从通知启动和 Activity http
  • 从边列表构建所有哈密顿路径

    我无法找到从相关元组列表构建树路径的方法 我只想要每个节点被访问一次的每个路径的列表 也称为哈密尔顿路径 我不断接近 但错过了一些路径 例如 假设我们有以下连接列表 connections 1 4 1 5 2 5 3 4 4 1 4 3 4
  • expo-auth-session - 返回应用程序时的两个应用程序选项

    SDK版本 43 0 0 平台 Android iOS 网络 所有 Android 您好 我在托管工作流程中使用 expo auth session 通过其官方 API 收集 Instagram 用户数据 它在开发环境中运行良好 通过 ex
  • awk 搜索字符串并设置退出代码(如果存在)

    我想检查两个地址之间是否存在一行并返回退出代码0如果它存在并且1如果没有 我想我已经有了一个可能的例子 但我想知道是否有一种更干净的方法来做到这一点 或者也许是 RedHat 上也常见的不同工具 我的命令 awk BEGIN found 1
  • 管道超级代理响应到快速响应

    我正在尝试使用 Express 应用程序 代理 一些文件 为什么下面的代码不起作用 var app require express var request require superagent app get image function
  • GeoServer 不会写入我的 PostgreSQL 可更新视图

    继从这个先前的问题我使用的是 PostgreSQL 8 4 并且在可更新视图方面遇到问题 我有一个看法 CREATE VIEW filedata view AS SELECT num id ST TRANSFORM the geom 900
  • 单击 vue 组件中的“保存”按钮后如何关闭模式?

    我的 vue 组件是这样的
  • Java listjar 目录中的文件

    有什么办法可以使用吗listFiles 在已打包到 jar 中的目录上 假设我的资源目录中有一个目录 其中包含一些文本文件 texts text1 txt and texts text2 txt 在这个 Java 程序中 我有一个需要使用的
  • 正确使用GetRawInputBuffer

    我正在尝试使用 Win32 原始输入 API 以更高精度收集原始鼠标数据 但我似乎无法理解文档和样本完全为了GetRawInputBuffer 当我的鼠标悬停在窗口上时 似乎什么也没有发生 当我单击或释放窗口标题栏时 我似乎只获得缓冲数据
  • NetBeans 不再为以前生成的代码生成 JAR 文件

    两年前 我使用 Java 编写了一个简单的上传小程序 使用 NetBeans 开发 当我第一次点击 清理和构建 时 以及之后的一段时间 它运行得非常完美 它将运行整个构建过程并生成一个 JAR 文件 然后我可以将其上传到我的 Web 服务器
  • 用于阻止特定日期(假期)的引导日期选择器配置

    有谁知道如何配置日期选择器不显示特定日期 例如 7 月 4 日 这似乎可以使用 beforeShowDay 来完成 但我并不肯定 http jsfiddle net Lr3taznx a array of dates that should
  • 如何启用cookie

    我有这个任务来读取 写入 启用 cookie 以便将用户名存储在变量中 然后写入 cookie 我的问题是代码的最后一部分似乎正在工作 但是用户名应该存储到变量中的第一部分不起作用 我可以看到当我运行代码时 前两个警报框没有显示 它应该以
  • React传单和react-leaflet-draw

    我正在尝试在传单地图上实现绘制功能 我创建了一个仅安装了react leaflet的新应用程序 使用npx create react app并安装了以下软件包 npm install React React dom 传单 npm 安装反应传
  • 复制到剪贴板在 Android 上不起作用

    使用此视图创建标准移动应用程序 public class DebugView extends View ListView
  • 为什么 sys.getrefcount 给出巨大的值?

    import sys a 10 b a print sys getrefcount a b 1 print sys getrefcount b output 22 614 我的Python解释器有问题吗 为什么这会给出像 614 这样巨大的
  • Android:Proguard 的推荐配置是什么?

    我正在为 Android 开发应用程序并使用 Proguard 来混淆代码 目前我正在使用 ProGuard 配置 optimizationpasses 5 dontusemixedcaseclassnames dontskipnonpub
  • MVC4 & IClientValidatable - 自动 AJAX 调用服务器端验证

    我正在寻找在 MVC4 中实现自定义客户端验证 我目前让它与标准属性配合得很好 例如我的模型中的这个 public class UploadedFiles StringLength 255 ErrorMessage Path is too