使用MVC3与jQuery和Ajax相结合的数据收集站点。该站点使用选项卡(jquery选项卡),作为部分加载,每个选项卡都连接到ajax-forms。因此,每个选项卡只在“自身”内加载和提交。
但是这会给自动注销和重定向到LogOn带来问题。例如,当我按下一个新选项卡时,注销将触发。然后,该选项卡将使用完整的登录页呈现,而不是刷新“父/顶”窗口。因此,整个站点都在其中一个选项卡中进行镜像(就像使用框架时经常发生的情况一样)。这不是框架或iframe在网站上的使用。
解决这一问题的一种方法可能是接收ajax调用(可能在OnBegin中),以检查用户是否已登录。如果没有,则将整个窗口url重定向/帐户/登录。但是,我不知道如何做到这一点,或者这是否是最好的方法。有什么关于执行的想法或更好地处理这个问题的建议吗?
一些代码示例:
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,部分片段: 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,它有着与我相似的问题。但是我不能向控制器添加任何代码,因为整个控制器类被包装在“Roles=(xxx,yyy")”中,所以在实际控制器操作之前进行登录检查。
我尝试在AccountController中拦截"LogOn“下的调用,但结果却是无限循环:)
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();
}发布于 2013-01-25 16:51:26
试着使用
Request.IsAjaxRequest()以检测ajax请求。这是System.Web.Mvc中的一种扩展方法。
或者您可以手动检查:
bool isAjaxRequest = request.Headers["X-Requested-With"] == "XMLHttpRequest";这样,您就可以进行拦截和测试以进行身份验证,并采取相应的行动。您可以选择不显示布局,或者停止整个请求并将其发送到登录页面。
https://stackoverflow.com/questions/14526100
复制相似问题