ASP.NET-MVC jQuery 不显眼的远程验证返回误报

2024-01-03

我又回到了 9 个月前我最后一次参与的项目,查看了我们编写的一些代码,希望现在有更好的方法来做到这一点......

虽然最初对 jQuery 不显眼的验证印象深刻,但我们最终不得不将下面的 hack 组合在一起(部分基于我现在无法动手的博客文章)来处理远程验证。问题在于,如果服务器端验证过程很慢(通常是涉及数据库调用的任何事情),验证器将不会等待验证方法的响应,并且会表现得好像它已经传回了肯定值。

黑客基本上是继续检查验证器是否有任何待处理的请求,直到没有任何待处理的请求为止,此时您可以确定真实的验证结果:

function SaveChangePassword() {

// Find form, fire validation
var $form = $("#btnSave").closest("form");

if ($form.valid()) {
//Do nothing - just firing validation
}

// Calls method every 30 milliseconds until remote validation is complete
var interval = setInterval(saveWhenValidationComplete, 30);

// Check if validation pending, save and clear interval if not
function saveWhenValidationComplete() {

    // Find form validator, check if validation pending - save once remote validation is finished
    var validator = $form.data("validator");
    if (validator.pendingRequest === 0) {

        clearInterval(interval);

        //Force validation to present to user (this will not retrigger remote validation)
        if ($form.valid()) {

            var closeButton = "<br/><input type='button' value='OK' style='font-size:small; font-weight:bold; float:right;' onclick=\"$('#changePasswordDialog').dialog('close');\" class='greenbutton' />";
            // If form is valid then submit
            $.ajax(
                {
                    type: "POST",
                    url: "/Account/SavePassword",
                    data: $form.serialize(),
                    success: function (result) {
                        var successMessage = "<div style='text-align:center; margin-top: 10px;'>" + result + "<div>";
                        $("#changePasswordDialog").html(successMessage + closeButton);
                            },
                    error: function (jqXhr, textStatus, errorThrown) {
                        // Populate dialog with error message and button
                        var errorMessage = "<div style='text-align:center'>Error '" + jqXhr.status + "' (Status: '" + textStatus + "', errorThrown: '" + errorThrown + "')<div>";
                        $("#changePasswordDialog").html(errorMessage + closeButton);
                    }
                });

        }

        // Else validation will show
    }

    // Else don't save yet, wait another 30 miliseconds while validation runs
};

// Prevent default and stop event propagation
return false;
}

我希望在过去的 9 个月里能够取得一些进展,而这已经不再是必要的了!欢迎任何想法,如果我可以提供任何进一步的细节,请告诉我。


虽然您可以提供客户端验证作为对用户的好处,但您应该始终(always!) 在服务器上重新验证。用户很容易禁用 javascript 或以其他方式伪造无效的 POST 到您的控制器操作,如果您不检查服务器端的内容,您就会为用户创建破坏系统中数据的机会。

幸运的是,ASP.NET MVC 中的大多数验证都已经为您完成了。如果您的控制器操作如下所示:

public ActionResult SaveSomething(Something thing)
{
    if(!ModelState.IsValid)
    {
        return View("EditSomething", thing);
    }
    // otherwise, save something...
}

...然后您将发现用户提供的值无法绑定到您的数据属性的问题,以及由属性验证的内容,例如[Required] and [StringLength(x)]。但是,某些形式的验证不会自动为您检查。[Remote]是其中之一。

如果你有一个[Remote]指向控制器操作的属性,如下所示:

public ActionResult CheckThingCodeValidity(string code)
{
    return Json(_thingCodeChecker.ThingCodeWorks(code), JsonRequestBehavior.AllowGet);
}

...那么您的提交操作中也应该有类似的内容:

public ActionResult SaveSomething(Something thing)
{
    if(!_thingCodeChecker.ThingCodeWorks(thing.Code))
    {
        ModelState.AddModelError("Code", "This code is not valid.");
    }
    if(!ModelState.IsValid)
    {
        return View("EditSomething", thing);
    }
    // otherwise, save something...
}

这样,您的标准服务器端验证技术就可以将视图发送回用户,并为他们提供有关该属性的错误消息,以指示他们需要修复的内容。

如果您这样做,那么您不必担心提交表单时异步验证检查是否仍在进行中。如果您的客户端验证通常因缺陷、网络问题或恶意用户干预而失败,也没关系。您仍然会阻止他们提交无效的内容,并且他们仍然会得到一个很好的视图,告诉他们为什么提交无效。

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

ASP.NET-MVC jQuery 不显眼的远程验证返回误报 的相关文章

随机推荐

  • 记住多个项目的已读/未读状态的最有效方法是什么?

    例如 我们采用论坛的格式 其中有多个用户和多个线程 假设该论坛想要跟踪哪些用户已阅读哪些线程 并在查看线程列表时使用该信息来标记哪些线程未读 我能想到的唯一解决方案是每次用户访问线程时将记录放入数据库中 我想可能有一个 将所有标记为已读 按
  • 保存字符串时 SharedPreferences nullPointerException

    我正在为 Android 工作启动器 目前我正在处理地址簿 是的 我想将其包含到我的启动器中 但我正在NullPointerException 这是我的主框架的一部分 其中调用了导致错误的类 Numbers j new Numbers Ed
  • Razor 对通用扩展方法的支持

    关于 Razor 视图引擎 假设我想渲染Html TextBoxFor
  • 在 PHP 中将指数转换为整数[重复]

    这个问题在这里已经有答案了 可能的重复 在php中将指数数转换为小数 https stackoverflow com questions 4461444 convert exponential number to decimal in ph
  • 如何清理精灵而不覆盖其他东西?

    我正在尝试在 pygame 中制作俄罗斯方块 并且发生了碰撞和移动 但是当遮罩与放置的块碰撞时 我用来覆盖旧精灵的矩形覆盖了放置的精灵的部分 def replace self pygame draw rect board surface 0
  • 如何实现iOS应用内购买动态价格图书?

    我开发了一个 iOS 应用程序 用户可以购买有声读物 从而可以在应用程序内进行流式传输和下载 我已经集成了 Authorize net 支付网关 被苹果拒绝了 说 11 2 使用应用内购买 API IAP 以外的系统来购买应用中的内容 功能
  • Symfony 5 security.interactive_login 事件未调用

    我想使用security interactive login更新我的用户的上次登录字段的事件 活动注册成功 php bin console debug event dispatcher security interactive login
  • 如何用Java计算Azure存储容器大小?

    虽然以下链接详细介绍了使用 C 计算存储大小的方法 但我在 Java 中没有看到类似的方法 如果有人可以发布 Java 示例代码 我将不胜感激 Azure 存储容器大小 https stackoverflow com questions 1
  • 如何获取 SQLite 数据库表中的列列表?

    我正在寻找检索表中的列列表 该数据库是最新版本的 SQLite 我相信是 3 6 我正在寻找使用 SQL 查询执行此操作的代码 与列相关的元数据的额外奖励点 例如长度 数据类型等 您要查找的内容称为数据字典 在 sqlite 中 可以通过查
  • xrange 与 itertools.count Python 2.7

    我想运行从开始值到结束值的范围 它在较小的数字上工作正常 但当它变得太大时 会导致溢出错误 因为 int 太大而无法转换为 C Long 我正在使用Python 2 7 3 我在这里读到OverflowError Python int 太大
  • 如何在Spring Data JPA中执行AND和多个OR参数方法

    我正在尝试为此查询制定方法名称 Query from Employees where department 1 and fullTime true or contractor true or subContractor true 我认为这种
  • 抑制 C 警告“未使用的变量 x”的最佳方法? [复制]

    这个问题在这里已经有答案了 抑制 C 编译器 例如 GCC 如 未使用的变量 x 警告的最佳 最巧妙的方法是什么 GCC 文档解释 Wunused 变量每当局部变量或非常量静态变量除了其声明之外未使用时发出警告 我不想给我的编译器任何特定的
  • py2exe:由于 DLL,编译的 Python Windows 应用程序将无法运行

    我承认我对 Python 还很陌生 而且我还不知道自己在做什么 最近 我使用 Python 2 6 2 和 wxPython 2 8 创建了一个非常小的 Windows 应用程序 而且效果很好 我对它正常运行的情况感到非常满意 通常我的意思
  • C - IF(char[] == "ZYX") 不起作用

    我从arduino发送到arduino字符串 I2C 捕获并保存到char 10 当我将此变量与文本进行比较时 条件没有执行 而且我不知道为什么 char dataRx 10 void DaemonReceiving int howMany
  • 当外字段是数组时 MongoDB 查找

    我搜索过互联网和 StackOverflow 但找不到答案 甚至找不到问题 我有两个收藏 reports and users 我希望我的查询返回所有报告 并指示指定用户是否将该报告作为其数组中的最爱 报告收集 id 1 name Repor
  • Android 虚拟设备管理器因“双重释放或损坏”而崩溃

    当我尝试运行任何模拟器时 我得到 Android 虚拟设备崩溃 https i stack imgur com bmI8A png 我玩 Android studio 的控制台说 Error in home standy Android S
  • 我的 python 代码不将视频帧保存为图像

    我正在尝试抓取视频中的特定帧 例如帧 0 10 20 并使用 Python 和 CV2 将它们保存为图像 由于某些原因 我的代码只保存第一帧 所有其他帧均已创建 但大小为 0 它们已损坏 我该如何解决这个问题 import cv2 from
  • Django Forms,为 request.user 设置初始值

    是否有某种方法可以使以下操作成为可能 或者应该在其他地方完成 class JobRecordForm forms ModelForm supervisor forms ModelChoiceField queryset User objec
  • 实体类型没有定义键 - 代码优先

    我是 MVC 和实体框架的新手 我搜索了很多并发现了一些类似的问题 例如实体类型没有定义键 https stackoverflow com questions 6290511 entity type has no key defined 但
  • ASP.NET-MVC jQuery 不显眼的远程验证返回误报

    我又回到了 9 个月前我最后一次参与的项目 查看了我们编写的一些代码 希望现在有更好的方法来做到这一点 虽然最初对 jQuery 不显眼的验证印象深刻 但我们最终不得不将下面的 hack 组合在一起 部分基于我现在无法动手的博客文章 来处理