【问题标题】:Run MVC Remote Validation Synchronously同步运行 MVC 远程验证
【发布时间】:2015-06-04 21:32:02
【问题描述】:

我正在使用 MVC 内置的远程验证来验证服务器端的表单。

我的模型视图如下所示:

[Required(ErrorMessage = "{0} is required")]
[Remote ("ValidateUserID", "MyController", AdditionalFields = "AccountType", ErrorMessage = "{0} cannot be found.")]
[Display(Name = "Account")]
public string Account { get; set; }

通常情况下,我的远程验证几乎是即时的,但很少会被赶上并且需要将近 1 或 2 秒才能完成。这会导致我的表单出现问题。

我的其他一些字段基于Account 字段是否有效。

所以我需要强制这个远程验证同步运行。

在你说之前,我知道它会冻结页面。但我对此没意见。如果你们能给我更好的想法,也非常感谢。

谢谢!

【问题讨论】:

  • 某种部分页面阻塞,直到您从服务器获得响应? malsup.com/jquery/block 似乎是个不错的选择。为此,您需要将表单验证逻辑分解为小步骤

标签: jquery asp.net-mvc validation synchronous


【解决方案1】:

这由jquery.validate.js 文件中的remote: function(value, element, param) { 方法控制,该方法进行ajax 调用并使用默认的async: true

您可以修改此文件(添加async: false,),但我不建议这样做。相反,您可以删除[Remote],然后处理输入的.change() 事件,以使用async: false, 对控制器进行自己的ajax 调用。

【讨论】:

    【解决方案2】:

    如果你能给我任何替代的想法

    您可以使用简单的jquery-ui 对话框,其中包含文本“请稍候...”(或特定内容,例如“验证...”)和动画图像。

    在帖子之前显示对话框,并在收到回复时关闭它。

    如果您使用不显眼的验证,则需要添加以下内容:

    $("form").bind("invalid-form.validate", function () {
        // hide 'please wait' 
    });
    

    其他选项是通过超时显示它,所以它只在帖子花费超过很短的时间时显示,并且使用某种形式的淡入淡出(不确定是否可以通过对话框),那么你就不会感到烦人闪现的时间非常快。

    另一种选择是在表单 div 上应用半透明覆盖(例如不透明度 80%)(而不是整个页面上的对话框)。如果您的页面上有多个面板/部分,这很有效 - 例如,在远程验证帐户字段时覆盖您的其他字段。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-20
      • 2011-12-25
      • 2011-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-24
      • 2017-03-10
      相关资源
      最近更新 更多