何时通过Model vs ViewBag传递数据

时间:2014-07-10 15:53:54

标签: c# asp.net-mvc

在ASP.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;}

}

查看

@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理念。

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

1 个答案:

答案 0 :(得分:2)

&#34;最佳实践&#34;是创建ViewModel,其中包含Model中的数据以及生成视图所需的任何其他数据(选择列表等)。然后将ViewModel的结果映射回Model

ViewBag是一种快捷方式,可以避免将似乎的类定义为与Model几乎完全相同的类。在实践中,您经常会因各种原因发现自己创建ViewModel

  • 向您的模型添加您不希望公开的属性(例如用户对象的密码字段)
  • 使用模型上不存在的强类型属性(例如,选择列表)
  • 复合视图(来自多个&#34;模型的数据&#34;)