为什么if(Request.IsAjaxRequest)为假

时间:2013-05-15 09:51:35

标签: asp.net-mvc jquery asp.net-mvc-4

我希望有一个超链接,点击后会在同一页面中打开而不会刷新整个页面而不是打开不同的链接。 在我的控制器中,我有以下功能

public ActionResult PrivacyPolicy()
{
    if (Request.IsAjaxRequest())
    {
       return PartialView();
    }
       return View();
}

当我运行程序并在return view();处插入断点时,我发现我的程序始终返回view()而不是PartialView();

这是index.cshtml代码

@section head{

    <script type="text/javascript"
            src="@Url.Content("~/scripts/AjaxDemo.js")"></script>
}
@Html.ActionLink("Show the Privacy Policy", "PrivacyPolicy", null, new{id="privacyLink"})

<div id="privacy"></div>

在局部视图中PrivacyPolicy我只有几个文本。

并且AjaxDemo.js看起来像这样

$(document).ready(function () {
    $('#privacyLink').click(function (event) {
        event.preventDefault();
        var url = $(this).attr('href');
        $('#privacy').load(url);
    });
});

为什么我的程序不返回局部视图?或者为什么不接受ajax请求? 如果我的浏览器中的javascript启用,我的程序不应该打开同一索引页面(CustomAjax)中的链接吗?

2 个答案:

答案 0 :(得分:2)

如果你执行jQuery加载,它实际上会执行一个普通请求,然后在给定元素中加载结果数据。

您应该删除自定义JavaScript代码,使用内置的ajax帮助程序并在AjaxOptions中指定updateTargetID:

    @Ajax.ActionLink("Show the Privacy Policy", "PrivacyPolicy", null, new{id="privacyLink"}, new AjaxOptions {UpdateTargetId = "privacy"})

    <div id="privacy"></div>

编辑:添加有关IsAjaxRequest()的更多信息:

当您发出Ajax请求时,您应该将X-Requested-With HTTP标头设置为XMLHttpRequest'. Internally, IsAjaxRequest`检查是否存在此标头。

当您使用jQuery.Ajax或默认的Ajax助手时,将包含此标头。 如果您使用jQuery.load(),则不包含此标头。 jQuery.load不允许设置自定义标头。

修改 要使用Ajax.ActionLink,您需要包含不显眼的ajax库并在web.config中启用它:

<configuration>
    <appSettings>
        <add key="UnobtrusiveJavaScriptEnabled" value="true"/>
    </appSettings>
</configuration>

除了设置标志之外,您还需要使用jQuery(~/Scripts/jquery.unobtrusive-ajax.js)包含用于不引人注目的Ajax的MVC插件。

答案 1 :(得分:0)

IIRC event是一个保留字。试试这样:

$('#privacyLink').click(function (e) {
    e.preventDefault();
    var url = $(this).attr('href');
    $('#privacy').load(url);
});

或:

$('#privacyLink').click(function () {
    var url = $(this).attr('href');
    $('#privacy').load(url);
    return false;
});

另外,不要忘记在<{1}}脚本之前加入jQuery.js