Asp.net mvc 3 在ajax post之前使用不引人注目的方法进行验证

Asp.net mvc 3 在ajax post之前使用不引人注目的方法进行验证,asp.net-mvc-3,jquery,Asp.net Mvc 3,Jquery,多亏了你们,我一直在玩防伪令牌 我已经想出了一个解决方案来合并表单值,并让我的ActionMethods不吐在AntiForgery令牌上。。。不幸的是,我在这个过程中破坏了验证。AJAX post在客户端验证/客户端验证被忽略之前触发。服务器端工作,但我会挖掘一些验证后。。这是我正在使用的代码 $(document).ready(function () { $('input[type=submit]').live("click", function (event) { event.

多亏了你们,我一直在玩防伪令牌

我已经想出了一个解决方案来合并表单值,并让我的ActionMethods不吐在AntiForgery令牌上。。。不幸的是,我在这个过程中破坏了验证。AJAX post在客户端验证/客户端验证被忽略之前触发。服务器端工作,但我会挖掘一些验证后。。这是我正在使用的代码

$(document).ready(function () {
 $('input[type=submit]').live("click", function (event) {
     event.preventDefault();

     // Form with the AntiForgeryToken in it
     var _tokenForm = $(this).parents().find("#__AjaxAntiForgeryForm");

     // Current Form we are using
     var _currentForm = $(this).closest('form');

     // Element to update passed in from AjaxOptions
     var _updateElement = $(_currentForm).attr("data-ajax-update");

     // Serialize the array
     var arr = $(_currentForm).serializeArray();

     //Merge TokenForm with the CurrentForm
     $.merge(arr, $(_tokenForm).serializeArray());


     // The AJAX Form Post stuff
     $.ajax({
         type: "POST",
         url: $(_currentForm).attr('action'),
         data: arr,
         success: function (data) {
             $(_updateElement).html(data);
         }
     });

     return false;
 });
}))

所以我想我需要在$.ajax goo之前以某种方式处理客户端验证。。。任何建议都可能为我节省一些时间。

称之为:

var formValid = $("#FormId").validate().form();

if (!formValid) return false;
添加到您的代码中:

$(document).ready(function () {
 $('input[type=submit]').live("click", function (event) {
     event.preventDefault();

     // Form with the AntiForgeryToken in it
     var _tokenForm = $(this).parents().find("#__AjaxAntiForgeryForm");

     // Current Form we are using
     var _currentForm = $(this).closest('form');

     var isValid = $(_currentForm).validate().form();

     if (!isValid) return false;

     // Element to update passed in from AjaxOptions
     var _updateElement = $(_currentForm).attr("data-ajax-update");

     // Serialize the array
     var arr = $(_currentForm).serializeArray();

     //Merge TokenForm with the CurrentForm
     $.merge(arr, $(_tokenForm).serializeArray());


     // The AJAX Form Post stuff
     $.ajax({
         type: "POST",
         url: $(_currentForm).attr('action'),
         data: arr,
         success: function (data) {
             $(_updateElement).html(data);
         }
     });

     return false;
 });
});

请注意您将遇到的另一个问题。由于您实际上是在复制jquery.unobtrusive ajax.js所做的工作,因此将有两篇文章发送到服务器。我还想到,如果在页面上的每个表单中添加一个AntiForgeryToken,那么整个解决方案都是不必要的,因为jquery.unobtrusive-ajax.js将传回要提交的表单中找到的任何u requestVerificationToken字段,我确实尝试过将令牌放入每个表单中,但是当使用@Ajax.BeginForm时,令牌没有被放入表单集合中,而表单集合必须在其中才能正常工作。此外,如果我想进行Ajax调用,但没有表单,该怎么办?这是很常见的。我有一个使用@Ajax.BeginForm()的表单,它包含一个AntiForgeryToken,并使用jquery.unobtrusive-Ajax.js提交,当我使用Fiddler检查时,我看到已经提交了u RequestVerificationToken。至于在没有表单的情况下提交AJAX,这是一个单独的考虑事项,jquery.unobtrusive-AJAX.cs不会处理这个问题,它依赖于现有的表单。是的,在我最初的帖子中,我问如何在帖子之前手动启动客户端验证。我的部分视图的表单中也没有验证标记,该标记是在主布局中生成的。我认为无需为每个表单生成一个令牌,也无需对cookie进行后续更改。顺便说一句,我在Fiddler中只看到一篇文章,不知道为什么会有两篇。我正要用$('form').live(“提交验证似乎在那里有效。不过我更喜欢这个。未来的读者,注意:在这个答案发布几个月后,jQuery.live()被弃用()。