使用带有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();
}
答案 0 :(得分:1)
尝试使用
Request.IsAjaxRequest()
检测ajax请求。它是System.Web.Mvc。
中的扩展方法或者您可以手动检查:
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";
通过这种方法,您可以进行拦截并测试身份验证,并采取相应措施。您可以选择不显示布局或停止整个请求,而是发送到登录页面。