it-swarm-ru.tech

Ajax.ActionLink не работает, Response.IsAjaxRequest () всегда ложно

Я некоторое время гуглил/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";
        }
    }
    

Я всегда получаю сообщение «FAIL» на пустую страницу, а не в целевом div.

Правка: Также обратите внимание, что если я удалю 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 MVC 3 использует ненавязчивый jquery со всеми помощниками Ajax.*. Итак, начните с избавления от всех скриптов MicrosoftAjax (это бесполезный с ** 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 AJAXify этот якорь:

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

Здесь описывается еще одна специфическая для IE проблема, которая может помешать правильной работе ActionLink: ASP.NET MVC - предотвращение кэширования на Ajax.ActionLinks

По сути, IE иногда кэширует запросы Ajax GET, поэтому установка для 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"
         })
1
Paul Smith