Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery 在部分视图(而不是顶部/父视图)中自动注销加载_Jquery_Ajax_Asp.net Mvc 3 - Fatal编程技术网

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

Jquery 在部分视图(而不是顶部/父视图)中自动注销加载,jquery,ajax,asp.net-mvc-3,Jquery,Ajax,Asp.net Mvc 3,一个使用MVC3、jQuery和Ajax的数据收集站点。该站点正在使用选项卡(jQueryUITabs),作为部分加载,每个选项卡都连接到ajax表单。因此,每个选项卡仅在“自身”中加载和提交 但这会造成自动注销和重定向到登录的问题。例如,当我按下一个新标签时,注销将触发。然后,此选项卡将显示完整的登录页面,而不是刷新“父/顶”窗口。因此,整个站点在其中一个选项卡中镜像(就像使用框架时经常发生的情况)。不过,网站上没有使用框架或iframe 解决此问题的一种方法可能是在OnBegin中接受aja

一个使用MVC3、jQuery和Ajax的数据收集站点。该站点正在使用选项卡(jQueryUITabs),作为部分加载,每个选项卡都连接到ajax表单。因此,每个选项卡仅在“自身”中加载和提交

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

解决此问题的一种方法可能是在OnBegin中接受ajax调用,以检查用户是否登录。如果没有,则将整个窗口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>
Web.config,身份验证

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

<authentication mode="Forms">
  <!-- TODO: Change back to 60 -->
  <forms loginUrl="/Account/LogOn" timeout="2" />
</authentication>
作为参考,这是我最后使用的:

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

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

或者您可以手动检查:

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

有了它,您可以进行拦截和身份验证测试,并相应地采取行动。您可以选择不显示布局,也可以停止整个请求并发送到登录页面。

谢谢@whoshotjr。这肯定是朝着正确的方向迈出的一步,但当我在控制器中添加对此的检查时,除非用户登录,否则不会得到检查。如果用户因不活动而注销,则“跳过”控制器并显示登录页面。问题仍然存在,因为登录页面现在是选项卡下的一个子页面(页面场景中的一个页面)。您的问题编辑显示您现在只是重定向ajax调用,并创建另一个ajax调用,从而产生循环。相反,您可以向客户端发送一些javascript,将其重定向到登录页面的完整回发。只需使用Scriptmanager.RegisterClientScriptBlock发送一个window.location实际上…我之前关于Scriptmanager.RegisterClientScriptBlock的评论可能是web forms-y。必须记住这是MVC。LOLI正在四处寻找如何利用“脚本块”。关于如何从控制器内部调用“正常”url重定向,还有其他想法吗?现在我正在尝试:返回JavaScript(“window.location='/Account/LogOn'”;。但如果它能工作,我会感到惊讶,因为该方法根本不期望输出。事实上,我的最后一条评论有效:)不知道ActionResult只能包含javascript。谢谢你把我引向正确的方向@whoshotjr
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";