2011-08-20 52 views
0

我在创建ASP.NET MVC 2应用程序,它使用数据注释的客户端验证数据生成的过程asp.net的MVC客户端验证状态:需要安装/拆卸覆盖

我有以下jQuery来添加覆盖随时点击表格

$(":button").click(function() { 
    var overlay = jQuery('<div id="overlay"><img src="/content/images/indicator2.gif" alt="Processing Request Please Wait"/> </div>'); 
    overlay.appendTo(document.body); 
    }); 

这个工程的大部分时间上的一个按钮,但我已经注意到,仍然是许多当客户端验证失败覆盖了一倍。

我希望仅在没有客户端验证错误时才附加覆盖。我怎样才能获得客户端验证的状态。

if(client_error==null) 
{ 
attach overlay 

} 

此外,如果这不是为了覆盖让我知道正确的方式。

发现了另一个问题,但没有答案 https://stackoverflow.com/questions/4848539/block-ui-and-client-side-validations

谢谢

**编辑**

nekno的解决方案是最适合现在。

我发现了另一个链接,可以给其他更深入的了解您使用的是传统的形式(Html.BeginForm())或AJAX形式(Ajax.BeginForm())寻找同样的东西

http://www.phpvs.net/2010/04/26/manually-validate-an-asp-net-mvc-form-on-the-client-side-with-microsoftmvcvalidation-js-and-jquery/

+0

您可以使用BlockUI ---我将其添加到我的示例中,作为使用'$(“#overlay”)。show()'或您想要制作的任何其他UI选项的替代方法。您仍然需要使用MVC验证框架来首先获取错误计数。 – nekno

回答

0

如果您使用的是AJAX表单,那么您可以通过将覆盖div放在表单上并使用style="display:none;"并将AjaxOptions对象传递给表单来处理这种情况,那么MVC AJAX库将仅自动显示/隐藏它如果表单通过验证并提交。

<% Html.EnableClientValidation(); %> 
<% using(Ajax.BeginForm(new AjaxOptions() { LoadingElementId = "overlay" }) { %> 
<div id="overlay" style="display:none;"> 
    <img src="/content/images/indicator2.gif" alt="Processing Request Please Wait"/> 
</div> 
... 
<% } %> 

你可以看看Brad Wilson的上Unobtrusive Ajax in ASP.NET MVC 3岗位,其中讨论了不显眼的AJAX前MVC 2的行为为好。

如果您使用的是传统表单,那么您可以将通用展示叠加代码应用于页面上的所有表单(如下所示),或者为表单提供一个ID,以便您可以为每个表单显示不同的覆盖形成。您调用客户端验证方法,该方法返回一组错误。如果没有错误,验证成功并继续提交。这确实会有两次调用验证代码的副作用,因为MVC验证框架会挂钩表单提交事件并自动再次调用validate()。但是,它发生两次的事实是不可察觉的,实际上,只要您输入一个值并将焦点移开,动态验证就会验证字段,但验证代码已在您的页面上多次运行。它并不总是立即发生两次。

将这个脚本在您的视图底部,下面的所有表单标签:

<script type="text/javascript"> 
    $("form").submit(function (e) { 
     var errors = Sys.Mvc.FormContext.getValidationForForm(this).validate('submit'); 
     if (errors.length == 0) { 
      $("#overlay").show(); 
      // Or use jQuery BlockUI 
      $.blockUI({ message: $("#overlay") }); 
     } 
    }); 
</script> 

more info from Scott Guthrie,他演示了取消表单提交和自己提交。他这样做是为了处理来自部分视图的动态数据。

+0

@ nenko-谢谢你的回复。我正在做一个传统的表格,但不知道我是否想验证两次。如果没有找到其他解决方案,我可能会试图使用你的建议 – TheMar

+0

我明白你的意思,但验证码已经多次执行---每次你离开一个字段或更正一个验证失败的值,并且再次提交。 – nekno

+0

@ nenko-我从来没有意识到验证码被多次执行。现在你说,这是如此明显。那么我想,再说一次就好了。谢谢你的建议。 – TheMar

0

如果您的情况允许,请下载jQuery Block UI插件。将做你想做的事(展示那条信息)。它非常简单,我一直都在使用它。

+0

Juan-探针不是如何显示覆盖图,但不是如果客户端验证失败,不会激活它。另一位用户使用Block UI面临同样的问题。看看我添加到我的问题的最后一次编辑。正如Nenko建议您仍然需要首先检查错误计数。 – TheMar