我有一個聯繫頁面,而這個頁面應由顯示窗體或成功消息或失敗消息,所以基本上是這樣的:與ASP.NET MVC聯繫頁3
@model MyApp.Models.ContactData
@{
Layout = "~/Views/Shared/_Layout.cshtml";
}
<div>
...Some static content...
If page was opened the first time
-> Render a form here
Else If form was posted and data successfully processed
-> Render a success message here
Else If form was posted but error occurred during processing
-> Render a failure message here
...Some static content...
</div>
我不不知道用MVC 3實現這一點的最好方法是什麼?我是否創建了三個完全獨立的視圖(這是我想避免的,因爲靜態內容對於所有三個視圖都是相同的)?或者,我可以創建三個部分視圖,然後根據一個額外的標誌來決定我可以放入模型類中的部分視圖來渲染嗎?或者我可以從控制器動態注入局部視圖到視圖中?
控制器我到目前爲止是這樣的:
public class ContactController : Controller
{
public ActionResult Index()
{
return View();
}
[HttpPost]
public ActionResult Index(ContactData contactData)
{
if (ModelState.IsValid)
{
ContactService service = new ContactService();
bool result = service.Process(contactData);
return ?; // What do I return now? It must somehow depend on result.
}
else
return View(contactData));
}
}
我也有類似的頁面和行爲與ASP.NET WebForms和解決方案在那裏把標記的三可變塊爲asp:Panel
控制和然後從代碼隱藏開啓或關閉這些面板的標誌。我想我需要另一種方法與ASP.NET MVC達到相同的目標。
什麼是最好的方法?
感謝您提前提出建議!
您的解決方案似乎比p.campbell的解決方案有優勢(請參閱我對他的回答的評論)。 TempData與ViewBag形成鮮明對比需要多長時間?它似乎在'RedirectToAction'中存在,而ViewBag顯然不是這種情況。 – Slauma 2011-05-08 11:43:04
TempData存在於這些場景中。數據僅適用於一個請求。但是,如果您需要多個後續請求的數據(比如某個嚮導),則可以通過調用Keep()方法來「延長」此數據。查看MSDN上的更多詳細信息:http://goo.gl/rEQ03 – frennky 2011-05-08 12:24:55
這看起來確實很像完美的方式。在此期間,我瞭解到這種模式甚至有一個名稱:「Post/Redirect/Get(PRG)模式」,並且TempData用於支持這種模式。再次感謝! – Slauma 2011-05-09 14:33:50