在部分视图中自动注销加载而不是顶部/父级

时间:2013-01-25 16:30:09

标签: jquery ajax asp.net-mvc-3

使用带有jQuery和Ajax的MVC3的数据收集站点。该站点使用制表符(jquery ui制表符),作为部分加载,每个都连接到ajax表单。因此,每个选项卡仅在“自身”内加载和提交。

但是这会导致自动注销和重定向到LogOn的问题。例如,当我按下新标签时,注销将触发。然后,将使用完整的LogOn页面呈现此选项卡,而不是刷新“父/顶”窗口。因此整个站点在其中一个选项卡中进行镜像(就像使用框架时经常发生的那样)。但网站上没有框架或iframe用法。

可能解决问题的一种方法是通过ajax调用(可能在OnBegin中)来检查用户是否已登录。如果没有将整个窗口URL重定向到/ Account / LogOn。我不知道如何实现这一点,或者它是否是最好的方式。关于执行的任何想法或更好地处理这个的提示?

一些代码示例:

Edit.cshtml,代码段:标签

<div id="tabs">
<ul>
    <li><a href="@Url.Action("PatientGeneralTab", new { guid = @Model })"><span>General</span></a></li>
    <li><a href="@Url.Action("PatientVisitTab", new { guid = @Model })"><span>Visit</span></a></li>
    <li><a href="@Url.Action("PatientDiaryTab", new { guid = @Model })"><span>Treatment</span></a></li>
    <li><a href="@Url.Action("PatientReactionTab", new { guid = @Model })"><span>Adverse Drug Reaction</span></a></li>
</ul>
</div>

General.cshtml,partial,snippet:Ajax.BeginForm()

@using (Ajax.BeginForm("StoreGeneral",
new { },
new AjaxOptions { HttpMethod = "POST", OnBegin = "Saving", OnSuccess = "SavedOk(); reloadPatientHeader();" },
new { id = "form-general" }))
{
    form content here.
}

Web.config,身份验证

<authentication mode="Forms">
  <!-- TODO: Change back to 60 -->
  <forms loginUrl="/Account/LogOn" timeout="2" />
</authentication>

不确定是否需要发布任何其他代码段。如果是这样,请告诉我。

修改

我偶然发现this question与我有类似问题。但我无法向控制器添加任何代码,因为整个控制器类都包含在“[Authorize(Roles =”xxx,yyy“)]”中,因此在实际控制器操作之前进行登录检查。

我尝试在“LogOn”下拦截AccountController中的调用,但之后它最终会以无限循环结束:)

    public ActionResult LogOn()
    {
        bool isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
        if (isAjaxRequest && !Request.IsAuthenticated)
        {
            //Response.Headers["X-Requested-With"] = "";
            return RedirectToAction("LogOn");
        }
        return View();
    }

解决方案

作为参考,这是我最终使用的:

    public ActionResult LogOn()
    {
        bool isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
        if (isAjaxRequest && !Request.IsAuthenticated)
        {
            return JavaScript("window.location = '/Account/LogOn'");
        }
        return View();
    }

1 个答案:

答案 0 :(得分:1)

尝试使用

Request.IsAjaxRequest()

检测ajax请求。它是System.Web.Mvc。

中的扩展方法

或者您可以手动检查:

bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";

通过这种方法,您可以进行拦截并测试身份验证,并采取相应措施。您可以选择不显示布局或停止整个请求,而是发送到登录页面。