Отрисовка действия return View(); проблема формы
Я новичок в MVC, поэтому, пожалуйста, потерпите меня.:-)
У меня есть строго типизированное представление "История". Это представление (история) может иметь комментарии.
Я создал два представления (не частичные) для моего контроллера комментариев "ListStoryComments" и "CreateStoryComment", которые делают то, что подразумевают их имена. Эти представления включены в представление истории с помощью RenderAction, например:
<!-- List comments -->
<h2>All Comments</h2>
<% Html.RenderAction("ListStoryComments", "Comments", new { id = Model.Story.Id }); %>
<!-- Create new comment -->
<% Html.RenderAction("CreateStoryComment", "Comments", new { id = Model.Story.Id }); %>
(Я передаю идентификатор Story для того, чтобы перечислить связанные комментарии).
Все работает, как я и надеялся, за исключением того, что когда я публикую новый комментарий с помощью формы, он возвращает текущее (родительское) представление, но в поле формы Комментарии все еще отображается последнее введенное мной содержимое, а представление ListStoryComments не обновляется до показать новую историю.
По сути, страница загружается из кеша, как будто я нажал кнопку "Назад" браузера. Если я нажму f5, он попытается повторно опубликовать форму. Если я перезагружу страницу вручную (повторно введите URL-адрес в адресной строке браузера), а затем нажмите клавишу f5, я увижу мой новый контент и пустое поле формы, которое является моим желаемым результатом.
Для полноты моего действия CreateStoryComment выглядит так:
[HttpPost]
public ActionResult CreateStoryComment([Bind(Exclude = "Id, Timestamp, ByUserId, ForUserId")]Comment commentToCreate)
{
try
{
commentToCreate.ByUserId = userGuid;
commentToCreate.ForUserId = userGuid;
commentToCreate.StoryId = 2; // hard-coded for testing
_repository.CreateComment(commentToCreate);
return View();
}
catch
{
return View();
}
}
4 ответа
Ответ заключается в использовании возврата RedirectToAction(). Использование этого усиливает паттерн PRG и достигает моей цели.
Мой предыдущий комментарий к моему исходному сообщению действительно вызвал ошибку, о которой, я думаю, я все еще запутался, но это работает:
return RedirectToAction("Details", "Steps", new { id = "2" });
Я, и это личное мнение, думаю, что вы решили это неправильно.
Лично я бы;
- Создайте представление под названием ListStories.
- Создайте частичное представление, которое перечисляет истории.
- Создайте частичное представление, чтобы создать историю.
- Если вы хотите добавить историю, просто покажите HTML-файл добавления истории.
- Затем, когда пользователь нажимает кнопку, вы выполняете обратную передачу jQuery, добавляете новую историю и возвращаете PartialView либо новой истории, либо всех историй.
- Если вы вернете частичное представление всех историй, замените ограничивающий div, содержащий все истории, новыми данными.
- Если вы вернете только одну историю, добавьте ее в конец раздела, содержащего истории.
Я знаю, что это требует много доработки, и это звучит сложно и как большая работа, но делать это так, как это, означает большую гибкость позже, потому что вы можете повторно использовать частичные представления или вы можете внести изменения один раз и все представления, используя это частичное представление теперь обновлено.
Кроме того, использование jQuery означает, что добавление историй выглядит без каких-либо очевидных постов, что приятно.
Поскольку проблема заключается в кешировании, вы можете просто отключить / ограничить кеширование.
Добавьте следующий атрибут к своим действиям:
[OutputCache(Duration = 0, VaryByParam = "none")]
Это скажет браузеру кэшировать страницу, но на 0 секунд. Когда сообщение перезагрузит страницу, вы должны увидеть желаемые результаты.
Ответ заключается в том, чтобы убедиться, что ваше действие формы правильно установлено. Если вы использовали визуализацию и не устанавливали контроллер формы и действие вручную, то действие будет текущим URL.
Пытаться:
<% using (Html.BeginForm("ActionName", "ControllerName")) {%>
Вместо:
<% using (Html.BeginForm()) {%>