Ajax.ActionLink не работает, Response.IsAjaxRequest () всегда ложно - PullRequest
21 голосов
/ 11 февраля 2011

Я гуглял / ТАК: эта проблема уже некоторое время, и многие, кажется, делятся этим, но я не нашел какого-либо успешного решения моей проблемы.

Использование 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";
        }
    }
    

Я всегда возвращаю сообщение "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, но безрезультатно.

Ответы [ 2 ]

47 голосов
/ 11 февраля 2011

По умолчанию ASP.NET MVC 3 использует ненавязчивый jquery со всеми помощниками Ajax.*.Итак, начните с избавления от всех сценариев 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>

, а затем просто активируйте ненавязчивый AJAX в вашем файле web.config (если это еще не сделано):

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

Теперь jquery будет ненавязчиво AJAXify для всех ссылок, содержащих эти атрибуты HTML 5 data-*.

Или даже лучше ИМХО:

На ваш взгляд, просто:

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

и в отдельном файле javascript AJA. Укажите этот якорь:

$(function() {
    $('#mylink').click(function() {
        $('#AjaxTestDiv').load(this.href);
        return false;
    });
});
1 голос
/ 21 февраля 2013

Еще одна специфичная для IE проблема, которая может помешать правильной работе ActionLink, описана здесь: ASP.NET MVC - предотвращение кэширования на Ajax.поэтому установка HttpMethod в AjaxOption на 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"
         })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...