Подтвердить что ты не робот

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

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

Использование MVC3 и Razor.

  • Основная страница содержит:

    <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>

  • AjaxTest.cshtml содержит:

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

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

  • Метод действия 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, но безрезультатно.

4b9b3361

Ответ 1

По умолчанию 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 AJAXify this anchor:

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

Ответ 2

Здесь описывается другая проблема, связанная с IE, которая может поддерживать корректную работу ActionLink: ASP.NET MVC - предотвращение кеша на Ajax.ActionLinks

В основном IE иногда кэширует запросы AJAX GET, поэтому установка 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"
         })

Ответ 3

Для тех, кто все еще сталкивается с этой проблемой:

У вас должны быть файлы ниже в вашем проекте где-то:

enter image description here

Если нет, то ниже представлен пакет nuget, либо загрузите его из менеджера nuget в вашем проекте Visual Studio или из консоли менеджера пакетов: https://www.nuget.org/packages/Microsoft.jQuery.Unobtrusive.Validation/3.2.11/

Укажите ссылку на добавленный выше файл после последней версии jquery.min.js в соответствующем представлении или файле макета:

enter image description here