1

どこにもこの種の詳細を見つけることができないように見えるので、いくつかの奇妙な動作があります...

セットアップ: ASP.NET MVC 4 と VS 2010 を使用して、検索ページと、検索の選択に基づいて企業ツリーを表示する詳細ページを備えた企業ディレクトリ アプリケーションを作成しました。

検索ページは非常に基本的なもので、ajax.beginform を使用すると、選択した条件に基づいてユーザーのリストが返されます。人をクリックすると、その人、上司、部下を示す「ツリー」が表示されます。

問題 ユーザーが誰かを検索し、その結果をクリックすると、ツリーが表示されます。戻るボタンをクリックすると (ツリー ビューで他のアクションを実行するかどうかに関係なく)、検索画面に戻ります。彼らが入力した基準はそこにありますが、結果はありません (私が期待するように)。検索をクリックするか、Enter キーを押すと、ユーザーは 404 ページが見つからないというエラーを受け取ります...

私が試し たこと 私が読んだことから、私はキャッシュを中心に展開する可能な解決策に焦点を当ててきました.ページを期限切れにするか、ページをキャッシュなしに設定しようとしましたが、それは問題を解決していないようです. .

コード

検索ビュー:

@using (Ajax.BeginForm("PersonList", "Home", new AjaxOptions { UpdateTargetId = "results", InsertionMode=InsertionMode.Replace }))
{

        @Html.LabelFor(model => model.LastName)
        @Html.TextBoxFor(model => model.LastName)<br />

        @Html.LabelFor(model => model.FirstName)
        @Html.TextBoxFor(model => model.FirstName)<br />

        <input type="submit" value="Search" />

        <div id="results">
        </div>
}

検索結果に表示されるブロック。これは、ツリー ビューにも再利用される部分的なビューです。そのため、ブロックの上部にあるリンクが条件付きであることがわかります。検索ページからリンクを使用する場合は、ページ全体を強制的に変更する html リンクです。ただし、既にツリー ビューを表示している場合、ナビゲーションは ajax を介して行われます。私が受け取っている 404 エラーは、ツリー ビュー ページをまったく移動せずに発生します。

<div id="p@{ Html.DisplayFor(model => model.Id); }" class="personCard">
    <img class="personImg" id="img@{ Html.DisplayFor(model => model.Id); }" src="@Url.Content("~/Photos")/@Html.DisplayFor(model => model.Id)" />
    <div>
        @if(ViewBag.IsForSearch == null) {
            @Ajax.ActionLink(this.Model.FullName, "PersonHierarchy", new { id = this.Model.Id }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "tree" })
        } else {
            @Html.ActionLink(this.Model.FullName, "Person", new { id = this.Model.Id })
        }
        @if(this.Model.TeamSize > 0) {
            @:&nbsp;(
            @Html.DisplayFor(model => model.TeamSize)
            @:)
        }
        <br />
        @Html.DisplayFor(model => model.Title)<br />
        @Html.DisplayFor(model => model.MailLocationCode), @Html.DisplayFor(model => model.WorkNumber) &nbsp;&nbsp; @Html.DisplayFor(model => model.ExtensionForDisplay)<br />
        @if (this.Model.CellNumber.Trim() != string.Empty)
        {
            @:Cell:
            @Html.DisplayFor(model => model.CellNumber)
            @:<br />
        }
        @Html.DisplayFor(model => model.EmailAddress)
    </div>
</div>

サーバーからの応答:

「/」アプリケーションでサーバー エラーが発生しました。

リソースが見つかりません。説明: HTTP 404。探しているリソース (またはその依存関係の 1 つ) は、削除されたか、名前が変更されたか、一時的に利用できない可能性があります。次の URL を見直して、スペルが正しいことを確認してください。

要求された URL: /

-------------------------------------------------- ------------------------------ バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.0.30319.272

編集: これは IE 9 (すべてのモード) に固有のようです。この動作は Chrome では発生せず、検索フォームは戻るボタンを使用した後に完全に再送信されます...

4

2 に答える 2

3

わかりました...答えが見つかったようです:

要約すると、特に IE 9 で ASP.NET MVC Ajax を使用している場合、[戻る] ボタンを使用して ajax フォームのあるページに戻り、そのフォームを送信しようとすると、404 エラーが発生します。

最初に、ページを「リロード」する必要があることを IE に強制的に認識させるために、さまざまなキャッシュ ソリューションを調べました (ただし、Chrome や他のブラウザーでは、[戻る] ボタンを使用したときにフォームを再び機能させることに問題はありませんでした)。どうやらこれが正しい道のりだったようですが、残念ながら十分な距離まで到達できませんでした。解決策は、コントローラー アクション (またはコントローラー全体) の OutputCache を次のように設定することです。

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]

その注釈をコントローラーのアクションまたはコントローラークラス全体に追加すると、問題が解決しました...IEに感謝します...

これに関する詳細については、ソースを参照してください: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/

助けようとしたすべての人に感謝します。

于 2012-05-01T15:46:24.910 に答える
1

開発者ツール [F12] 、Fiddler、Firebug などを使用して、404 エラー メッセージを返すリクエストが何であるかを確認しましたか? どのリクエストが 404 を返しているかを判断することで、おそらくリクエストが正しくない理由を突き止めることができます。

于 2012-04-30T20:36:23.733 に答える