在ASP.NET MVC中,您可以隨時使用ViewBag
,ViewData
和TempData
(有關更多信息,請參閱this blog post)。 ViewBag
是圍繞ViewData
字典的動態封裝。如果你這樣做ViewBag.Prop = "value"
它相當於ViewData["Prop"] = "value"
。當您在視圖中使用Model
媒體資源時,您正在檢索ViewData.Model
。尋找自己:
public abstract class WebViewPage<TModel> : WebViewPage
{
private ViewDataDictionary<TModel> _viewData;
public new AjaxHelper<TModel> Ajax { get; set; }
public new HtmlHelper<TModel> Html { get; set; }
public new TModel Model { get { return ViewData.Model; } }
}
我們可以通過使用ViewBag
或ViewData
握住你的特殊性能實現您的結束。第一步是創建WebViewPage<TModel>
自定義導出你想要的屬性:
public abstract class CustomWebViewPage<TModel> : WebViewPage<TModel>
{
public IList<string> Messages
{
get { return ViewBag.Messages ?? (ViewBag.Messages = new List<string>()); }
}
}
現在去到您的視圖,並替換爲以下行@model YourModelClass
(第一行):
@inherits CustomWebViewPage<YourModelClass>
您現在可以在視圖中使用Messages
屬性。
@String.Join(", ", Messages)
要在控制器上使用它,你可能會想從Controller
派生並添加屬性那裏。
public abstract class CustomControllerBase : Controller
{
public IList<string> Messages
{
get
{
return ViewBag.Messages ?? (ViewBag.Messages = new List<string>());
}
}
}
現在,如果您從該控制器派生,則可以使用您的新屬性。您在列表中添加的任何內容也將在視圖中提供給您。
public class ExampleController : CustomControllerBase
{
public ActionResult Index()
{
Messages.Add("This is a message");
return View();
}
}
我使用ViewBag,因爲它使屬性獲得更短。如果您願意(ViewData["Messages"]
),您可以使用ViewData
做同樣的事情。
這與Model
的實施方式並不完全相同,因爲如果您碰巧使用了您要保存的密鑰,某人可能意外覆蓋了您的財產,但它足夠接近以至於在功能上等同於您確保使用一個唯一的密鑰。
如果您深入挖掘,您可能可以從ViewDataDictionary
派生出來,然後將您的屬性放在那裏,然後重寫一些控制器和視圖方法以代替它。那麼你的財產將與Model
完全一樣。但我會把它留給你 - 我認爲這不值得。
你真的有2個選擇:ViewBag和在你的模型中的專用屬性 – 2013-03-22 20:58:21