Метод действия HttpPost, вызываемый при перезагрузке представления, представленного им

#asp.net-mvc-4 #viewmodel #actionmethod

#asp.net-mvc-4 #viewmodel #actionmethod

Вопрос:

У меня есть метод действия HTTPPOST, который получает модель и сохраняет ее в базе данных:

 [HttpPost]
public ActionResult AddDocument(Document doc){
   DocumentRepository repo= GetDocumentRepository();
   repo.SaveDocument(doc);
   return View(viewName: "DocViewer", model: doc);
}
 

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

  1. Если я нажму F5 после DocViewer представления, я получу предупреждение о том, что метод post будет вызван снова. Как мне этого избежать? Я уверен, что существует общая практика
  2. В DocViewer представлении я определил HTML-элементы следующим образом:
 <div>Full name</div>
<div>@Html.LabelFor(x=>x.FullName)</div> 
<div>Address</div>
<div>@Html.LabelFor(x=>x.Address)</div> //and so on
 

Но я получаю следующий вывод:

 Full name FullName
Address Address
 

Разве я не должен получать фактическое значение, но не имя свойства (или отображаемое имя, если оно указано)?

Ответ №1:

В последующем действии не возвращайте объект модели обратно в режим просмотра:

 [HttpPost]
public ActionResult AddDocument(Document doc)
{
   DocumentRepository repo= GetDocumentRepository();
   repo.SaveDocument(doc);
   //return View("DocViewer");
   TempData["Document"] = doc;
   return RedirectToAction("DocViewer","ControllerName");
}
 

и в действии DocViewer:

 public ActionResult DocViewer()
{
   Document doc = TempData["DocViewer"] as Document;
   return View(doc);

}
 

ОБНОВЛЕНО:

вы должны перенаправить на просмотр DocViewer с помощью его действия, чтобы избежать повторной отправки формы при нажатии F5.

Подробности смотрите здесь

Комментарии:

1. вместо возврата вида перенаправляется на просмотр с помощью его действия

2. Это действительно решает первую проблему. Как насчет второго? Почему я не получаю значения свойств модели вместо их имен?

3. Теперь все настроено, @Ehsan. Я нашел причину. Взгляните на мой ответ, если вам не все равно.

4. в чем была 2-я проблема, которую я не понял @MikeJM

5. При использовании @Html.LabelFor я не получал значения свойств модели, я получал имена свойств. Так, например, для свойства FullName я не получал Joe Black, я получал FullName.

Ответ №2:

Первая проблема действительно была решена ответом Эхсана. Я не должен возвращать объект модели в представление, вместо этого я должен перенаправить на другой метод действия. Вторая проблема возникла из-за характера LabelFor вспомогательного метода. Дело в том, что LabelFor просто создаются метки, которые предназначены для обозначения значений. Чтобы показать фактическое значение, не используя текстовое поле, вызывается другой метод DisplayTextFor . После использования этого метода я смог получить фактическое значение.