asp.net-mvc - 有效避免 ASP.NET MVC 中的 ViewBag

标签 asp.net-mvc architecture viewmodel viewbag

您如何处理避免 ViewBag 的问题,因为它有动态出错的风险,但也避免每次都必须填充新的 ViewModel 并将其传递回 View 。例如,我不想更改以下内容以公开通常填充在 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();
}

在 View 方面,而不是 @((IMessageCollection)ViewBag.Messages).Errors id 而是具有类似 @Messages.Errors 的东西,它是强类型的并且随处可用。此外,我不想只是将它转换到我的 Razor View 顶部的代码块中。

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

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

谢谢,
斯科特

最佳答案

Razor View 相当简单。您与单个模型进行交互,该模型是强类型的。那么,任何你想在 View 中强类型化的东西都需要在你的模型上。如果您的模型上有一些您不想要的东西或者是一次性的,那么 ViewBag作为所有非模型数据的通用包罗万象提供,这就是为什么它是动态的。强类型会限制它成为一个包罗万象的能力。

简短而简单:如果您想要强类型的消息添加到您的 View 模型。否则,请坚持使用 ViewBag .这些是你的选择。

关于asp.net-mvc - 有效避免 ASP.NET MVC 中的 ViewBag,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579673/

相关文章:

c# - 如何仅使用获取访问器绑定(bind)到属性

asp.net-mvc - 如何在 AngularJS 中向表单数据添加另一个参数

caching - 别名的定义/含义? (CPU缓存架构)

c# - 如何通过简单的绑定(bind)使用多个 ViewModel

python - 编写api时需要一些建议

Java 数据库访问构建器模式

asp.net-mvc - 在 MVC 中绑定(bind)集合

asp.net - HttpClient 可以有多个 HTTP 消息处理程序吗?

ajax - 使用带有下拉列表 mvc3 的 ajax

c# - 显示根据列排序自动生成的 SQL 代码