jQueryとAjaxでMVC3を使用するデータ収集サイト。このサイトはタブ(jquery uiタブ)を使用しており、パーシャルとしてロードされ、それぞれがajax-formsに接続されています。したがって、各タブは「それ自体」内でのみロードおよび送信されます。
ただし、これにより、自動ログアウトとLogOnへのリダイレクトに問題が発生します。たとえば、新しいタブを押すと、ログアウトが発生します。このタブは、「親/トップ」ウィンドウを更新する代わりに、ログオンページ全体でレンダリングされます。したがって、サイト全体がタブの1つにミラーリングされます(フレームを使用するときによく発生するように)。ただし、サイトではフレームやiframeの使用はありません。
おそらくそれを解決する1つの方法は、おそらく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>
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>
他のコードスニペットを投稿する必要があるかどうかわかりません。もしそうなら、私に知らせてください。
編集
私と同じような問題を抱えているこの質問に出くわしました。ただし、コントローラークラス全体が「[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();
}