Отрисовка действия 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" });

Я, и это личное мнение, думаю, что вы решили это неправильно.

Лично я бы;

  1. Создайте представление под названием ListStories.
  2. Создайте частичное представление, которое перечисляет истории.
  3. Создайте частичное представление, чтобы создать историю.
  4. Если вы хотите добавить историю, просто покажите HTML-файл добавления истории.
  5. Затем, когда пользователь нажимает кнопку, вы выполняете обратную передачу jQuery, добавляете новую историю и возвращаете PartialView либо новой истории, либо всех историй.
  6. Если вы вернете частичное представление всех историй, замените ограничивающий div, содержащий все истории, новыми данными.
  7. Если вы вернете только одну историю, добавьте ее в конец раздела, содержащего истории.

Я знаю, что это требует много доработки, и это звучит сложно и как большая работа, но делать это так, как это, означает большую гибкость позже, потому что вы можете повторно использовать частичные представления или вы можете внести изменения один раз и все представления, используя это частичное представление теперь обновлено.

Кроме того, использование jQuery означает, что добавление историй выглядит без каких-либо очевидных постов, что приятно.

Поскольку проблема заключается в кешировании, вы можете просто отключить / ограничить кеширование.

Добавьте следующий атрибут к своим действиям:

[OutputCache(Duration = 0, VaryByParam = "none")]

Это скажет браузеру кэшировать страницу, но на 0 секунд. Когда сообщение перезагрузит страницу, вы должны увидеть желаемые результаты.

Ответ заключается в том, чтобы убедиться, что ваше действие формы правильно установлено. Если вы использовали визуализацию и не устанавливали контроллер формы и действие вручную, то действие будет текущим URL.

Пытаться:

<% using (Html.BeginForm("ActionName", "ControllerName")) {%>

Вместо:

<% using (Html.BeginForm()) {%>
Другие вопросы по тегам