使用ViewModel屏蔽可为空的域属性

时间:2013-01-18 00:39:46

标签: asp.net-mvc asp.net-mvc-3 viewmodel nullable

我正在使用Entity Framework 4.0,并使用POCO对象。当我从数据库中填充POCO对象时,我将属性值转换为我自己的Domain对象,我们可以将其称为模型。

必然,我的Model的字段是否为Nullable取决于它在数据库中映射到的值是来自NULL还是NOT NULL列。我不会详细介绍,但值必须在DB中可以为空,因为用户可以在将对象发布到公共之前部分保存该对象的草稿。既然如此,我有几个可以为空的字段。所以让我们说我的模型看起来像:

public class MyModel
{
   public int? Field1 {get; set; }
   public DateTime? Field2 {get; set; }
   public int Field3 {get; set; }
}

如果我在我的视图中使用此模型,并使用可空字段,我开始收到错误,告诉我我不能在各个地方使用可空属性作为值,例如HTML助手等。我可以说像{{1}但是,对于一个观点而言,这感觉很笨。

我考虑创建一个ViewModel对象,该对象继承自原始域对象,并且具有if (Model.MyBoolField.HasValue && Model.MyBoolField.Value) { // etc },我的可空字段的非可空版本,如果基本版本为null,则返回适当的值。如下所示:

new

我的问题是我并不总是知道要显示的好的“默认”值。如果我在基本值为null时在View Model的getter中抛出异常怎么办?那是不好的做法吗?

我基本上正在寻找有关如何处理模型中可空字段的最佳实践,尤其是在视图中显示时。

2 个答案:

答案 0 :(得分:2)

如果您只需要在视图中显示这些字段,则无需指定或检查是否具有值。

在View文件中使用Model.Field1就足够了。它很简单,不会显示任何内容,也不会抛出exception。您可以随时使用??设置默认值。

@(Model.Field1 ?? "There is nothing to see here")

答案 1 :(得分:0)

在大多数情况下,我使用“For”帮助程序,对于Nullable值似乎没问题(PublishedCount是可以为空的属性):

@Html.TextBoxFor(m => m.BillPull.PublishedCount, new { id="txtPublishedCount" })
@Html.ValidationMessageFor(m => m.BillPull.PublishedCount)

当我只需使用TextBox时,我使用GetValueOrDefault方法,使用框架提供的默认值:

@Html.TextBox("BillPull.AutoPublishDate", Model.BillPull.AutoPublishDate.GetValueOrDefault().ToString(dateFormat), new { id = "dtpAutoPublishDate" })
@Html.ValidationMessageFor(m => m.BillPull.AutoPublishDate)