什么时候通过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哲学。
我处理我的视图的方式,然后导致非常大的模型类复杂的页面。像这样通过模型传递数据推荐吗?
"最佳实践"是创建一个ViewModel
,其中包含来自Model
的数据和生成视图所需的任何其他数据(选择列表等)。然后将ViewModel
的结果映射回Model
。
ViewBag
是一个快捷方式,以避免定义一个类,似乎几乎完全像你的Model
。在实践中,您经常会发现自己出于各种原因创建ViewModel
:
- 在你的模型中添加你不想暴露给视图的属性(例如用户对象的密码字段)
- 使用模型中不存在的强类型属性(例如选择列表)
- 复合视图(来自多个"模型"的数据)
- 等。