首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在部分视图中自动注销加载,而不是顶部/父视图。

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

Stack Overflow用户
提问于 2013-01-25 16:30:08
回答 1查看 1K关注 0票数 0

使用MVC3与jQuery和Ajax相结合的数据收集站点。该站点使用选项卡(jquery选项卡),作为部分加载,每个选项卡都连接到ajax-forms。因此,每个选项卡只在“自身”内加载和提交。

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

解决这一问题的一种方法可能是接收ajax调用(可能在OnBegin中),以检查用户是否已登录。如果没有,则将整个窗口url重定向/帐户/登录。但是,我不知道如何做到这一点,或者这是否是最好的方法。有什么关于执行的想法或更好地处理这个问题的建议吗?

一些代码示例:

Edit.cshtml,代码片段:选项卡

代码语言:javascript
复制
<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,部分片段: Ajax.BeginForm()

代码语言:javascript
复制
@using (Ajax.BeginForm("StoreGeneral",
new { },
new AjaxOptions { HttpMethod = "POST", OnBegin = "Saving", OnSuccess = "SavedOk(); reloadPatientHeader();" },
new { id = "form-general" }))
{
    form content here.
}

Web.config,身份验证

代码语言:javascript
复制
<authentication mode="Forms">
  <!-- TODO: Change back to 60 -->
  <forms loginUrl="/Account/LogOn" timeout="2" />
</authentication>

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

编辑

我偶然发现了this question,它有着与我相似的问题。但是我不能向控制器添加任何代码,因为整个控制器类被包装在“Roles=(xxx,yyy")”中,所以在实际控制器操作之前进行登录检查。

我尝试在AccountController中拦截"LogOn“下的调用,但结果却是无限循环:)

代码语言:javascript
复制
    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();
    }

解决方案

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

代码语言:javascript
复制
    public ActionResult LogOn()
    {
        bool isAjaxRequest = Request.Headers["X-Requested-With"] == "XMLHttpRequest";
        if (isAjaxRequest && !Request.IsAuthenticated)
        {
            return JavaScript("window.location = '/Account/LogOn'");
        }
        return View();
    }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-25 16:51:26

试着使用

代码语言:javascript
复制
Request.IsAjaxRequest()

以检测ajax请求。这是System.Web.Mvc中的一种扩展方法。

或者您可以手动检查:

代码语言:javascript
复制
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";

这样,您就可以进行拦截和测试以进行身份验证,并采取相应的行动。您可以选择不显示布局,或者停止整个请求并将其发送到登录页面。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14526100

复制
相关文章

相似问题

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