首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ajax.BeginForm与BeforeSend

Ajax.BeginForm与BeforeSend
EN

Stack Overflow用户
提问于 2014-02-20 18:33:20
回答 2查看 7.4K关注 0票数 2

我的MVC网站上有几个Ajax.BeginForm。同时,我需要处理Ajax调用的beforeSend事件。

因此,下面的代码适用于我的手动jquery调用,但它不适用于Ajax.BeginForm助手:

代码语言:javascript
复制
$.ajaxSetup({
    'beforeSend': function (xhr) {
        alert('');
    }
});

在MVC Ajax.BeginForm上是否有处理beforeSend事件的方法?

-------------------------------------------EDIT

我需要前发送事件,因为我想更改请求头:

代码语言:javascript
复制
'beforeSend': function (xhr) {
    securityToken = $('[name=__RequestVerificationToken]').val();
    xhr.setRequestHeader('__RequestVerificationToken', securityToken);
}

谢谢

EN

回答 2

Stack Overflow用户

发布于 2014-05-01 17:43:42

我认为您正在遵循http://richiban.wordpress.com/2013/02/06/validating-net-mvc-4-anti-forgery-tokens-in-ajax-requests/的示例,这篇文章不涉及Ajax表单集成的支持。我做了一些测试找到了解决办法。

我假设您将MVC4与引用的jquery-1.9.1.jsjquery.validate.unobtrusive.jsjquery.unobtrusive-ajax.js一起使用。

以下是我的代码

代码语言:javascript
复制
@model WebApplication1.Models.DummyModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
    <script src="~/Scripts/jquery-1.9.1.js"></script>
    <script src="~/Scripts/jquery.validate.js"></script>
    <script src="~/Scripts/jquery.validate.unobtrusive.js"></script>
    <script src="~/Scripts/jquery.unobtrusive-ajax.js"></script>
</head>
<body>
    <div id="Parent"> 
        @using (Ajax.BeginForm(new AjaxOptions { HttpMethod = "post", OnBegin = "BeginClient" }))
        {
            @Html.AntiForgeryToken();
            <div>First Name</div><div>@Html.TextAreaFor(m => m.FirstName)</div>
            <div>Last Name</div><div>@Html.TextAreaFor(m => m.LastName)</div>
            <input type="submit" value="Submit" />
        }
    </div>
    <script type="text/javascript">
        function BeginClient(xhr) {
            alert("posting...");
            securityToken = $('[name=__RequestVerificationToken]').val();
            xhr.setRequestHeader('__RequestVerificationToken', securityToken);
        }
        $.ajaxSetup({
            'beforeSend': function (xhr) {
                securityToken = $('[name=__RequestVerificationToken]').val();
                alert(securityToken);
                xhr.setRequestHeader("__RequestVerificationToken", securityToken);
            }
        });
    </script>
</body>
</html>

基本上,您需要利用onBegin事件,请参阅http://johnculviner.com/ajax-beginform-ajaxoptions-custom-arguments-for-oncomplete-onsuccess-onfailure-and-onbegin/有明确的解释,每个事件的参数是什么。

然后,在全局属性类中,代码如下所示

代码语言:javascript
复制
[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class ValidateAntiForgeryTokenOnAllPostsAttribute : AuthorizeAttribute
{
    /// <summary>
    /// Executes authorization based on anti-forge token.
    /// </summary>
    /// <param name="filterContext">MVC pipeline filter context.</param>
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var request = filterContext.HttpContext.Request;

        // Only validate POSTs
        if (request.HttpMethod == WebRequestMethods.Http.Post)
        {
            // Ajax POSTs and normal form posts have to be treated differently when it comes to validating the AntiForgeryToken
            if (request.IsAjaxRequest())
            {
                var antiForgeryCookie = request.Cookies[AntiForgeryConfig.CookieName];

                var cookieValue = antiForgeryCookie != null
                    ? antiForgeryCookie.Value
                    : null;

                AntiForgery.Validate(cookieValue, request.Headers["__RequestVerificationToken"]);
            }
            else
            {
                new ValidateAntiForgeryTokenAttribute().OnAuthorization(filterContext);
            }
        }
    }
}

通过这样做,您仍然可以强制使用Ajax表单中的防伪造令牌。

希望这能有所帮助。

票数 4
EN

Stack Overflow用户

发布于 2014-02-20 18:42:29

对于Ajax.BeginForm,您可以使用AjaxOptions.OnBegin

代码语言:javascript
复制
@using (Ajax.BeginForm("actionName", "controllerName", new AjaxOptions() {
            OnBegin = "requestBeginHandler"})) {
    ...markup here...
}

更新.添加新的请求头,您可以这样做:

代码语言:javascript
复制
function requestBeginHandler(ajaxContext) { 
    var request = ajaxCOntext.get_request();
    securityToken = $('[name=__RequestVerificationToken]').val();
    request.get_headers()['__RequestVerificationToken'] = securityToken;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21916560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档