屏蔽与视图模型为空的域属性(Shielding nullable domain properties

2019-08-07 06:27发布

我使用实体框架4.0,并利用POCO对象。 当我从DB填充POCO的对象,我的属性值转换成我自己的域对象,我们可以称之为我的模型。

不一定,我的模型的领域是否是可空取决于它映射到数据库中的值是否来自NULL或NOT NULL列。 我不会进入细节,但该值必须在DB空的,因为用户可以部分地将其发布给公众之前保存对象的草案。 既然如此,我有几个字段是空。 所以我们可以说我的模型是这样的:

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 } ,但感觉笨重对的图。

我认为创建一个从我原来的域对象继承,并有一个视图模型对象new我如果基础版本为空返回一个适当的值可为空字段,非空的版本。 因此,像:

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

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

我的这个问题是我并不总是知道一个良好的“默认”值显示。 如果我抛出异常,在视图模型的getter当基值为null? 是贫穷的做法?

基本上,我在寻找如何处理模型中的可空字段,在视图中显示尤其当一个最佳实践。

Answer 1:

如果你只需要在视图中显示这些字段,你不需要指定或检查是否有值与否。

使用Model.Field1在查看文件是不够的。 它将简单不显示任何东西,也不会抛出exception 。 您可以随时使用?? 当是有意义的设置默认。

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


Answer 2:

在大多数我用的是“对”的帮手,这似乎与OK的情况下, 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)


文章来源: Shielding nullable domain properties with ViewModel