2012-01-09 81 views
1

上工作动态加载形式在MVC 3.0,并且其中,当我禁用不显眼的javascript:验证不会通过Ajax

<key="UnobtrusiveJavaScriptEnabled" value="false" />

如果我加载通过jQuery的AJAX一个形式中,所述验证不起作用!事实上,下面的代码返回null:

alert(Sys.Mvc.FormContext.getValidationForForm($(this).closest('form')[0])); 

我知道解决的办法时启用不显眼的(通过调用$ .validator.unobtrusive.parse(ID);) 但是当它被禁用我该怎么办?

回答

0

我不知道为什么你想关闭验证只能手工完成。 无论如何,你的问题是,当你关闭不引人注目的验证时,asp.net助手不会输出验证函数使用的数据属性。

我的建议是离开<key="UnobtrusiveJavaScriptEnabled" value="false" />并取消注册jQuery事件。

+0

因为一些问题我不能打开不显眼的。那么没有它的解决方案是什么? – 2012-01-09 15:37:46

+0

从头开始写你自己的。 – linkerro 2012-01-09 16:19:07

1

确保您也叫Sys.Mvc.FormContext._Application_Load();

举个例子吧。

查看模型:

public class MyViewModel 
{ 
    [Required] 
    public string Foo { get; set; } 
} 

控制器:

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

    public ActionResult Create() 
    { 
     return PartialView(new MyViewModel()); 
    } 

    [HttpPost] 
    public ActionResult Create(MyViewModel model) 
    { 
     return Content("thanks for submitting"); 
    } 
} 

视图(Index.cshtml):

<script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script> 
<script src="@Url.Content("~/Scripts/MicrosoftMvcValidation.js")" type="text/javascript"></script> 
<script type="text/javascript"> 
    $.get('@Url.Action("create")', function (result) { 
     $('#foo').html(result); 

     // That's the important bit that you were probably missing 
     Sys.Mvc.FormContext._Application_Load(); 

     $('form').submit(function() { 
      if (Sys.Mvc.FormContext.getValidationForForm(this).validate('submit').length > 0) { 
       return false; 
      } 
     }); 
    }); 
</script> 

<div id="foo"></div> 

包含被动态加载的形式(Create.cshtml)部分:

@model MyViewModel 

@{Html.EnableClientValidation(true);} 
@using (Html.BeginForm()) 
{ 
    @Html.LabelFor(x => x.Foo) 
    @Html.EditorFor(x => x.Foo) 
    @Html.ValidationMessageFor(x => x.Foo) 
    <button type="submit">OK</button> 
} 

备注:很显然,只有在您想使用完全过时的Microsoft*.js脚本而不是推荐的jQuery unobtrusive和jQuery验证插件时,此答案才有效。因此,只有在您的web.config中设置<add key="UnobtrusiveJavaScriptEnabled" value="false"/>才有效。

+0

我添加了Sys.Mvc.FormContext._Application_Load();到页面,它运行没有任何错误,但没有任何改变!它返回“Uncaught TypeError:无法调用未定义的方法'验证'当达到Sys.Mvc.FormContext.getValidationForForm(this) – 2012-01-09 16:42:12

+0

@MahmoudMoravej,我不知道你没有显示你的代码,所以很难诊断问题。我为您提供了一个完整的工作示例。 – 2012-01-09 17:19:16

+0

也许问题是因为我在“index.cshtml”页面中有另一种形式。无论如何,我坚信我可以通过调用Html.EnableUnobtrusiveJavaScript(true)来为单个页面启用不引人注目的效果!所以我改变了我的战略,使用不显眼的JavaScript JUST为当前页!... – 2012-01-10 08:10:20