什么时候通过Model vs ViewBag传递数据

本文关键字:数据 ViewBag vs Model 什么时候 | 更新日期: 2023-09-27 18:12:25

. Net MVC项目决定何时通过模型或通过ViewBag传递数据的最佳实践是什么?

在我的模型中,我通常有用于验证我的实体对象的属性。

然而,在同一个Model类中,我不确定是否包括与我的业务实体无关的属性,而是页面的布局。例如,我有许多属性来决定是否呈现页面的某些部分,以及如果用户执行了ajax操作要显示的消息。

下面是一个代码示例,以便更好地解释。

public class MyModel {
[Required(ErrorMessage="The Name field is required")]
 public string Name{ get; set; }
public string SaveSuccessMessage {get; set;}
}
<<p> 视图/strong>
@model MyNameSpace.MyModel
<div>
  Some Content......
  Html.TextBoxFor(m => m.Name);
  <input type="button" value="Save Changes" onclick="DoAjaxCall()">
</div>
@If(Model.SaveSuccessMessage != null)
{
 <div class="myClass">
  <a class="close">x</a>
   Model.SaveSuccessMessage
 </div>
}

当用户保存更改时,控制器必须告诉PartialView显示服务器上生成的成功消息。我可以通过几种方式来实现,比如通过ViewBag

传递
if(ViewBag.SaveSuccessMessage != null)

然而,它似乎通过我的样本中所示的模型传递它是一个更好的选择,因为它是强类型的,我在一个地方有我需要的所有数据。但我不确定这是否违背了MVC哲学。

我处理我的视图的方式,然后导致非常大的模型类复杂的页面。像这样通过模型传递数据推荐吗?

什么时候通过Model vs ViewBag传递数据

"最佳实践"是创建一个ViewModel,其中包含来自Model的数据和生成视图所需的任何其他数据(选择列表等)。然后将ViewModel的结果映射回Model

ViewBag是一个快捷方式,以避免定义一个类,似乎几乎完全像你的Model。在实践中,您经常会发现自己出于各种原因创建ViewModel:

  • 在你的模型中添加你不想暴露给视图的属性(例如用户对象的密码字段)
  • 使用模型中不存在的强类型属性(例如选择列表)
  • 复合视图(来自多个"模型"的数据)
  • 等。