Кнопка возврата ASP.NET MVC 4 -> Отправка формы -> 404
Имея какое-то странное поведение, я бы хотел получить некоторую обратную связь, потому что, похоже, нигде не могу найти подробностей о подобных вещах...
Установка: Используя ASP.NET MVC 4 и VS 2010, я создал приложение корпоративного каталога со страницей поиска и страницей сведений, которая отображает корпоративное дерево на основе выбора поиска.
Страница поиска очень проста, и с помощью ajax.beginform она возвращает список людей обратно на основе выбранных критериев. После нажатия на человека вы получаете "дерево", показывающее этого человека, его руководителя и любых подчиненных.
Проблема Пользователь ищет кого-то, нажимает на его результат, видит дерево. Когда они нажимают кнопку "Назад" (с или без выполнения каких-либо других действий в древовидной структуре), они возвращаются на экран поиска. Критерии, которые они ввели, есть, но результатов нет (как я и ожидал). Если они нажимают кнопку поиска или нажимают клавишу ввода, пользователь получает сообщение об ошибке 404 страница не найдена...
Что я попробовал Из того, что я прочитал, я сосредоточился на возможных решениях, вращающихся вокруг кеша, я пытался истечь страницу или настроить страницу без кеша, но это, похоже, не решило проблему,
КОД
Поиск:
@using (Ajax.BeginForm("PersonList", "Home", new AjaxOptions { UpdateTargetId = "results", InsertionMode=InsertionMode.Replace }))
{
@Html.LabelFor(model => model.LastName)
@Html.TextBoxFor(model => model.LastName)<br />
@Html.LabelFor(model => model.FirstName)
@Html.TextBoxFor(model => model.FirstName)<br />
<input type="submit" value="Search" />
<div id="results">
</div>
}
Блок, который появляется для результатов поиска. Это частичное представление, которое также используется для древовидного представления. Вот почему вы увидите, что ссылка в верхней части блока находится в условном состоянии. Если ссылка должна использоваться со страницы поиска, это HTML-ссылка, которая вызывает полное изменение страницы. Если вы уже находитесь в древовидной структуре, навигация осуществляется через ajax. Ошибка 404, которую я получаю, происходит вообще без навигации на странице просмотра дерева:
<div id="p@{ Html.DisplayFor(model => model.Id); }" class="personCard">
<img class="personImg" id="img@{ Html.DisplayFor(model => model.Id); }" src="@Url.Content("~/Photos")/@Html.DisplayFor(model => model.Id)" />
<div>
@if(ViewBag.IsForSearch == null) {
@Ajax.ActionLink(this.Model.FullName, "PersonHierarchy", new { id = this.Model.Id }, new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.Replace, UpdateTargetId = "tree" })
} else {
@Html.ActionLink(this.Model.FullName, "Person", new { id = this.Model.Id })
}
@if(this.Model.TeamSize > 0) {
@: (
@Html.DisplayFor(model => model.TeamSize)
@:)
}
<br />
@Html.DisplayFor(model => model.Title)<br />
@Html.DisplayFor(model => model.MailLocationCode), @Html.DisplayFor(model => model.WorkNumber) @Html.DisplayFor(model => model.ExtensionForDisplay)<br />
@if (this.Model.CellNumber.Trim() != string.Empty)
{
@:Cell:
@Html.DisplayFor(model => model.CellNumber)
@:<br />
}
@Html.DisplayFor(model => model.EmailAddress)
</div>
</div>
Ответ с сервера:
Ошибка сервера в приложении '/'
Этот ресурс не может быть найден. Описание: HTTP 404. Ресурс, который вы ищете (или одна из его зависимостей), мог быть удален, изменилось его имя или временно недоступен. Пожалуйста, просмотрите следующий URL и убедитесь, что он написан правильно.
Запрашиваемый URL: /
-------------------------------------------------- ------------------------------ Информация о версии: Microsoft .NET Framework Версия:4.0.30319; ASP.NET версия:4.0.30319.272
РЕДАКТИРОВАТЬ: Это, кажется, характерно для IE 9 (во всех режимах). Такое поведение не происходит в Chrome, и форма поиска повторно отправляется отлично после использования кнопки назад...
2 ответа
ОК... Кажется, я нашел ответ:
Напомним, в частности, в IE 9 при использовании ASP.NET MVC Ajax, использование кнопки "Назад" для перехода на страницу, на которой есть форма ajax, и попытка отправить эту форму приводит к ошибке 404.
Сначала я изучил различные решения для кэширования, чтобы попытаться заставить IE понять, что страница должна быть "перезагружена" (даже несмотря на то, что в Chrome и других браузерах не возникало проблем с повторным использованием формы при использовании кнопки "Назад"). Это, очевидно, был правильный путь, чтобы пойти вниз, но, к сожалению, я не получил достаточно далеко. Решение в конечном итоге заключается в установке OutputCache для действия контроллера (или для всего контроллера) на:
[OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
Добавление этой аннотации к действию в контроллере или к классу контроллера в целом решило проблему... спасибо IE...
Для получения дополнительной информации об этом, я ссылаюсь на мой источник: http://dougwilsonsa.wordpress.com/2011/04/29/disabling-ie9-ajax-response-caching-asp-net-mvc-3-jquery/
Спасибо всем, кто пытался помочь.
Вы пытались использовать инструменты разработчика [F12], Fiddler, Firebug и т. Д., Чтобы узнать, что запрос возвращает 404 сообщение об ошибке? Определив, какой запрос возвращает 404, вы, вероятно, сможете выяснить, почему запрос неверен.