有效避免ASP.NET MVC中的ViewBag

Sco*_*ott 5 architecture asp.net-mvc viewmodel viewbag

你如何处理避免ViewBag的问题,因为它具有动态错误的风险,但也避免每次都要填充新的ViewModel并将其传回视图.例如,我不希望必须更改后续内容以暴露ViewBag中通常填充的常见数据.

[HttpGet]
void Index() 
{ 
    return View(); 
}
Run Code Online (Sandbox Code Playgroud)

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

    return View(messages);
}
Run Code Online (Sandbox Code Playgroud)

在管道中我将添加一个像ViewBag这样的属性,它是自定义的和强类型的,但它在Controller和View中都有优雅的外观.当我不需要特定的ViewModel时,我宁愿这样做......

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

    return View();
}
Run Code Online (Sandbox Code Playgroud)

而在视图方面,而不是@((IMessageCollection)ViewBag.Messages).Errors id更像是@ Messages.Errors,它是强类型的并且随处可用.另外,我不想只是在Razor视图顶部的代码块中将其抛出.

在WebForms中,我会做一些事情,比如把它作为一个基页,然后有一个usercontrol,可以根据需要隐藏或显示在页面上.由于Controller与View分离,我不确定如何复制类似的行为.

这是可能的还是最好的设计方法是什么?

谢谢,斯科特

Chr*_*att 8

Razor的观点相当简单.您可以使用强类型的单个模型进行交互.因此,您想要在视图中强烈输入的任何内容都需要在您的模型上.如果你有一些你不想要的模型或一次性的东西,那么ViewBag它将作为所有非模型数据的通用catch-all提供,这就是为什么它是动态的.强烈打字会限制它成为一个全能的能力.

简短:如果您希望强类型添加消息到您的视图模型.否则,坚持下去ViewBag.这些是你的选择.