Отрисовка действия return View (); проблема формы - PullRequest
1 голос
/ 07 января 2010

Я новичок в 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 id для перечисления связанных комментариев).

Все работает, как я и надеялся, за исключением того, что когда я публикую новый комментарий с помощью формы, он возвращает текущее (родительское) представление, но в поле формы Комментарии все еще отображается последнее введенное мной содержимое, а представление 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 ]

3 голосов
/ 08 января 2010

Ответ заключается в использовании return RedirectToAction (). Использование этого усиливает паттерн PRG и достигает моей цели.

Мой предыдущий комментарий к моему исходному сообщению вызвал ошибку, которую, я думаю, я все еще не понял, но это работает:

return RedirectToAction("Details", "Steps", new { id = "2" });
1 голос
/ 08 января 2010

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

Лично я бы;

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

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

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

0 голосов
/ 16 мая 2012

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

Попытка:

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

Вместо:

<% using (Html.BeginForm()) {%>
0 голосов
/ 29 апреля 2012

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

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

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

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

...