asp.net-mvc - 使用 ViewModel 屏蔽可为 null 的域属性

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

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

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

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

如果我在我的 View 中使用此模型,并包含可为空的字段,我开始收到错误,告诉我不能在各个地方使用可为空的属性作为值,例如 HTML 帮助程序等。我可以说类似 if (Model.MyBoolField.HasValue && Model.MyBoolField.Value) {//etc },但这对于 View 来说感觉很庞大。

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

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 模型的 getter 中抛出异常会怎样?这是不好的做法吗?

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

最佳答案

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

在 View 文件中使用 Model.Field1 就足够了。它不会显示任何内容,也不会抛出异常。您始终可以使用 ?? 在有意义的情况下设置默认值。

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

关于asp.net-mvc - 使用 ViewModel 屏蔽可为 null 的域属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14390711/

相关文章:

asp.net-mvc - MVC表单LoginUrl不正确

c# - 如何交叉多个IEnumerable?

css - 删除 ASP.NET MVC3 中的下拉列表向下箭头符号

c# - 将继承模型转换为 View 模型

asp.net-mvc - 我应该如何为需要在 ASP.NET MVC 中显示的分层数据构建我的 ViewModel?

asp.net-mvc - 在 Controller 中使用 HtmlHelper

asp.net-mvc - 如何通过 jQuery ajax 更新 ASP.NET MVC ViewData?

javascript - 嵌套 JSON 值不绑定(bind) MVC

c# - 该进程无法访问文件 '.mdf',因为该文件正在被另一个进程使用

wpf - MVVM - Datagrid 行中的 View 模型?