2010-01-07 3 views
1

Я новичок в MVC, поэтому, пожалуйста, несите меня. :-)Render action return View(); form

У меня есть строго типизированный вид «История». В этом представлении (истории) могут быть комментарии.

Я создал два представления (не частичные) для моего контроллера комментариев «ListStoryComments» и «CreateStoryComment», которые делают то, что подразумевают их имена. Эти взгляды включены в Story View с помощью 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 View isn обновлен, чтобы показать новую историю.

В основном, страница загружается из кеша, как если бы я нажал кнопку возврата браузера. Если я нажму 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(); 
     } 
    } 
+0

Я просто смотрел другое видео MVC Фила Хаака и он упоминает "PRG" образец (Post, перенаправление Получить), который должен , Я думаю, исправить эту проблему. Однако, если я попробую что-то вроде «return RedirectToAction (« Index »); Я получаю сообщение о том, что «Действиям с детьми не разрешено выполнять действия перенаправления», поэтому я все еще в тупике. –

ответ

1

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

Лично я хотел бы;

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

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

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

+0

Спасибо за ваш ответ ... это не совсем то, что я искал, но ценю ваше время! –

3

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

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

return RedirectToAction("Details", "Steps", new { id = "2" }); 
0

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

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

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

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

0

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

Try:

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

Вместо:

<% using (Html.BeginForm()) {%>