3

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

必然地,我的 Model 的字段是否为 Nullable 取决于它在数据库中映射到的值是来自 NULL 还是 NOT NULL 列。我不会详细介绍,但这些值在数据库中必须可以为空,因为用户可以在将对象发布给公众之前部分保存对象的草稿。在这种情况下,我有几个可以为空的字段。所以假设我的模型看起来像:

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

如果我在我的视图中使用这个模型,并带有可空字段,我开始收到错误消息,告诉我我不能在不同的地方使用可空属性作为值,比如 HTML 帮助器等。我可以说类似的东西if (Model.MyBoolField.HasValue && Model.MyBoolField.Value) { // etc },但对于一个看法。

我考虑创建一个 ViewModel 对象,该对象继承自我的原始域对象,并且new如果基本版本为空,我的可空字段的不可空版本会返回适当的值。所以像:

public class MyViewModel : MyModel
{
   public new int Field1
   {
      get { return base.Field1 ?? 7; }
   }

   public new DateTime Field2
   {
      get { return base.Field2 ?? DateTime.Now; }
   }
}

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

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

4

2 回答 2

2

如果只需要在 View 中显示这些字段,则不需要指定或检查 is 是否有值。

在您的视图文件中使用Model.Field1就足够了。它不会显示任何内容,也不会抛出exception. ??有意义时,您始终可以使用它来设置默认值。

@(Model.Field1 ?? "There is nothing to see here")
于 2013-01-18T00:53:59.843 回答
0

在大多数情况下,我使用“For”帮助器,它看起来可以使用Nullable值(PublishedCount是一个可为空的属性):

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

当我需要使用 justTextBox时,我使用该GetValueOrDefault方法,以及框架提供的任何默认值:

@Html.TextBox("BillPull.AutoPublishDate", Model.BillPull.AutoPublishDate.GetValueOrDefault().ToString(dateFormat), new { id = "dtpAutoPublishDate" })
@Html.ValidationMessageFor(m => m.BillPull.AutoPublishDate)
于 2013-01-18T01:04:45.803 回答