web-dev-qa-db-ja.com

Ajax.ActionLinkが機能せず、Response.IsAjaxRequest()は常にfalse

私はしばらくの間この問題をグーグル/ SO:していて、多くの人がこれを共有しているようですが、私の問題に対する成功した解決策は見つかりませんでした。

MVC3とRazorを使用します。

  1. マスターページに含まれるもの:

    <script src="@Url.Content("~/Scripts/jquery-1.5.min.js")" type="text/javascript"></script>

    <script src="@Url.Content("~/Scripts/MicrosoftAjax.js")" type="text/javascript"></script>

    <script src="@Url.Content("~/Scripts/MicrosoftMvcAjax.js")" type="text/javascript"></script>

  2. AjaxTest.cshtmlに含まれるもの:

    _<div id="AjaxTestDiv">content</div>_

    @Ajax.ActionLink("Update", "AjaxTester", new AjaxOptions { UpdateTargetId = "AjaxTestDiv" })

  3. AjaxTesterアクションメソッド:

    _public string AjaxTester()
    {
        if (Request.IsAjaxRequest())
        {
            return DateTime.Now.ToString();
        }
        else
        {
            return "FAIL";
        }
    }
    _

対象のdivではなく、常に「FAIL」が空白のページに返されます。

編集:if(Request.IsAjaxRequest())を削除しても、ターゲットのdivには何も戻らず、代わりに空白のページが返されることにも注意してください。

Edit2:生成されたHTMLを見ると、これは私のリンクです:

_<a data-ajax="true" data-ajax-method="POST" data-ajax-mode="replace"
data-ajax-update="#AjaxTestDiv" href="/Area/AjaxTester">Update</a>
_

メソッドをGETに切り替えてみましたが、役に立ちませんでした。

21
Anders Arpi

デフォルトでは、ASP.NET MVC3はすべてのAjax.*ヘルパーで目立たないjqueryを使用します。したがって、すべてのMicrosoftAjaxスクリプト(この役に立たないc ** p)を取り除くことから始めて、代わりに次のように配置します。

<script src="@Url.Content("~/Scripts/jquery-1.5.min.js")" type="text/javascript"></script>
<script src="@Url.Content("~/Scripts/jquery.unobtrusive-ajax.min.js")" type="text/javascript"></script>

次に、web.configで控えめなAJAXをアクティブにします(まだ実行されていない場合):

<appSettings>
    <add key="ClientValidationEnabled" value="true"/> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true"/> 
</appSettings>

これで、jqueryは、これらのHTML 5 data-*属性を含むすべてのリンクを目立たないようにAJAX化します。

またはさらに良い私見:

あなたの見解では、単に:

@Html.ActionLink("Update", "AjaxTester", new { id = "mylink" })

別のjavascriptファイルでこのアンカーをAJAXifyします。

$(function() {
    $('#mylink').click(function() {
        $('#AjaxTestDiv').load(this.href);
        return false;
    });
});
47
Darin Dimitrov

ActionLinkが正しく機能しない可能性のある別のIE固有の問題については、ここで説明します。 ASP.NET MVC-Ajax.ActionLinksでのキャッシュの防止

基本的に、IEはAjaxGETリクエストをキャッシュすることがあるため、AjaxOptionのHttpMethodをPOSTに設定することは、ActionLinkを構築するための脆弱性の少ない方法です。

@Ajax.ActionLink(
       item.Name + " (Ajax link test)",
         "MyActionName",
         routeValues: new { id = item.Id },
         ajaxOptions: new AjaxOptions()
         {
              UpdateTargetId = "divToUpdate",
              InsertionMode = InsertionMode.Replace,
              HttpMethod = "POST"
         })
1
Paul Smith

まだこの問題に直面している人のために:

プロジェクトのどこかに以下のファイルがあるはずです。

enter image description here

そうでない場合は、以下がnugetパッケージです。これは、VisualStudioプロジェクトのnugetmanagerまたはパッケージマネージャーコンソールからダウンロードしてください。 https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Validation/3.2 .11 /

それぞれのビューまたはレイアウトファイルで、jquery.min.jsの最新バージョンの後に上記で追加したファイルの参照を指定します。

enter image description here

0
Bhawna Jain