Asp.net-Mvc

有效避免 ASP.NET MVC 中的 ViewBag

  • May 15, 2015

您如何處理避免 ViewBag 的問題,因為它存在動態出錯的風險,但也避免每次都必須填充新的 ViewModel 並將其傳遞回視圖。例如,我不想更改以下內容以公開通常填充在 ViewBag 中的常見數據。

[HttpGet]
void Index() 
{ 
   return View(); 
}

[HttpGet]
void Index() 
{
   var messages = new MessageCollection();
   messages.AddError("Uh oh!");

   return View(messages);
}

我將在管道中的哪個位置添加一個像 ViewBag 這樣的自定義且強類型的屬性,但它會優雅地暴露在 Controller 和 View 中。當我不需要特定的 ViewModel 時,我寧願這樣做……

[HttpGet]
void Index()
{
   Messages.AddError("Uh oh!");

   return View();
}

在視圖方面,而不是 @((IMessageCollection)ViewBag.Messages).Errors id 而是具有類似 @Messages.Errors 的東西,它是強類型的並且隨處可用。此外,我不想只是將它投射到我的 Razor 視圖頂部的程式碼塊中。

在 WebForms 中,我會做一些事情,比如把它作為一個基本頁面,然後有一個使用者控制項,可以根據需要在頁面上隱藏或顯示。控制器與視圖分離後,我不確定如何複製類似的行為。

這是可能的還是最好的設計方法是什麼?

謝謝,斯科特

Razor 視圖相當簡單。您與單個模型進行互動,該模型是強類型的。那麼,任何你想在視圖中強類型化的東西都需要在你的模型上。如果您的模型中有一些您不想要的東西或者是一次性的,那麼ViewBag將作為所有非模型數據的通用包羅萬象提供,這就是為什麼它是動態的。強類型會限制它成為一個包羅萬象的能力。

簡短而簡單:如果您想要強類型的消息添加到您的視圖模型。否則,堅持ViewBag. 這些是你的選擇。

引用自:https://stackoverflow.com/questions/15579673