#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
представление для отображения добавленного документа. У меня есть две проблемы, в том числе одна в вопросе
- Если я нажму F5 после
DocViewer
представления, я получу предупреждение о том, что метод post будет вызван снова. Как мне этого избежать? Я уверен, что существует общая практика - В
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
. После использования этого метода я смог получить фактическое значение.