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, но безрезультатно.
Ответы
Ответ 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]()