(長い投稿を前もってお詫びしますが、私の知恵の終わりです)..
MVC 3 アプリケーション内で、より良い言葉が必要なため、jquery スクリプトが「失われる」という奇妙な問題が発生しています。
私のアプリ内には、次の _Layout.cshtml ファイルがあります。
<!DOCTYPE html>
<html>
<head>
<title>@ViewBag.Title</title>
<link href="@Url.Content("~/Content/Site.css")" rel="stylesheet" type="text/css" />
<script src="@Url.Content("../Scripts/jquery-1.5.1.min.js")" type="text/javascript"></script>
<script src="@Url.Content("../Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>
</head>
<body>
<div class="page">
<div id = "sidebar">
@{ Html.RenderPartial("_Sidebar"); }
</div>
<div id="main">
@RenderBody()
</div>
<div id="validationresults">
<div id="validationresultsinner"></div>
</div>
<div id="footer"></div>
</div>
</body>
</html>
サイドバー自体は、私の _Layout.cshtml の「メイン」領域に親ビューをロードするいくつかの Ajax.ActionLinks を含む部分ビューです。
<ul>
<li>@Ajax.ActionLink("Section 1", "WizardParentView", "Section1",null, new AjaxOptions()
{ UpdateTargetId = "main", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { id = "sect2" })</li>
<li>@Ajax.ActionLink("Section 2", "WizardParentView", "Section2", null, new AjaxOptions()
{ UpdateTargetId = "main", InsertionMode = InsertionMode.Replace, HttpMethod = "GET" }, new { id = "sect2" })</li>
</ul>
この WizardParentView 自体には、NuGet の MVCWizard.Wizard と組み合わせて使用される Ajax.Begin フォームが含まれており、ユーザーがナビゲートできるページの選択 (ウィザード タイプのページなど) をホストします。
例えば
@model MyDataModel
@{
FormWizardManager<MyDataModel> wm = (FormWizardManager<MyDataModel>)Session["TheSection"];
Layout = "";
}
@using (Ajax.BeginForm("WizardParentView", "Section1", new AjaxOptions() {
UpdateTargetId= "wizard", InsertionMode = InsertionMode.Replace }))
{
<div id="wizard">
@Html.WizardHeader(wm, true)
@{Html.RenderAction(wm.CurrentPage.PagePartialView);}
@Html.WizardFooter(wm, "Next Page " + (wm.Index + 1), "Previous Page" + (wm.Index - 1), "Save this Section")
</div>
}
@Content.Script("jquery.validate.js", Url)
@Content.Script("jquery.validate.unobtrusive.min.js", Url)
@Content.Script("UIHelpers.Section1.js", Url)
また、サイドバーのアイテムのテキストを変更して、ユーザーのウィザードの進行状況を永続的に反映するために必要な機能もいくつかあります。このテキストの変更は、ポストバック (サーバー側の検証が呼び出されたとき) で実行される別の JQuery によって実現されます。ご覧のとおり、サイドバー リンクが再度クリックされたときに元のサイドバーのパーシャルが単純にリロードされるのを停止するには (変更された後)、WizardParentView が読み込まれるときにレイアウトもクリアする必要がありました。
問題は、これを開発環境 (IIS7 Express または Visual Studio 2010 Web 開発サーバーを使用した IE9) で実行すると、JQuery または JQuery.Unobtrusive.Ajax を必要とするすべてのページの読み込みと機能が正常に動作することです。
ただし、完全な II7 または II6 (以下を参照) で同じ Web サイトを実行すると、コア スクリプトとすべての依存機能がロードされ、最初の 2 ページのナビゲーション試行では正常に動作することがわかりましたが、3 回目 (たとえば、「次へ」の 3 回目のプレス) では正常に動作します。つまり、部分的なビューが完全な Web ページにロードされ、ビュー内のすべての jquery 機能が機能しなくなります。
次のように、さらなる混乱が支配しています。
動作 中の JQuery 1.5.1 IE9、IIS7 Express、Visual Studio Web 開発サーバー
壊れた
JQuery 1.5.1 IE9、IIS6、IIS7、IIS7 Express
JQuery 1.5.1 Chrome/Firefox、IIS6、IIS7、II7 Express、Visual Studio Web 開発サーバー
JQuery 1.8.1 IE9、IIS6、IIS7、IIS7 Express、Visual Studio Web 開発サーバ
WizardParentViewの最初のロードでもレイアウトをクリアすると、_LayoutにロードしたJQueryスクリプトが消去されると思いますが、JQueryベースの機能が2〜3回のナビゲーション試行の後も機能し、その後死ぬという事実は奇妙なことです。 . アプリの機能が上記の構成の少なくとも 1 つで完全に機能することは言うまでもありません (すべてのシナリオで JQuery スクリプトが消去されるべきではありませんか? または、ブラウザーの特定の組み合わせで何らかの奇妙なキャッシュが行われているのでしょうか? JQueryのバージョンとWebサーバー?..申し訳ありませんが、それをより適切に説明するのに少し途方に暮れています..そして混乱した説明をお詫びします(私の頭では問題を明確に説明できます) :)