我正在努力寻找一种方法来处理视图模型中的空值。其中一些值是我模型中的嵌套或导航对象。如何在不向视图中引入逻辑的情况下保持视图不抛出空引用错误?这似乎很容易,但这是一天的结束。
我有一个带有一些导航属性的视图模型,如下所示:
ViewModel.cs
public class ViewModel
{
public ViewModel () {}
public ViewModel (Contact contact, IDemographicService demographicService)
: this()
{
Id = contact.Id;
Name = contact.Name;
EthnicityId = contact.EthnicityId;
if(EthnicityId > 0 || EthnicityId != null)
Ethnicity = deomographicService.GetEthnicityById((int)contact.EthnicityId);
}
public int Id {get;set;}
public string Name {get;set;}
public int? EthnicityId {get;set;}
public Ethnicity Ethnicity {get;set;}
}
我会跳过控制器,因为这不是我的问题的焦点。 (我知道逻辑可以进入控制器,但我选择将它放在ViewModel中。)
MyView.cshtml
@model ViewModel
<ul>
<li>@Model.Name</li>
<li>@Model.Ethnicity.Name</>//This is the null reference.
</ul>
我想我只能定义一个“EthnicityName”字符串(如果null返回null)而不是整个对象,但是有些实例我需要来自Ethnicity对象的多个属性。这消除了种族,无论是在视图模型,控制器还是视图中。简而言之,我该怎么办null.null?难住了。感谢。
答案 0 :(得分:1)
我几乎不认为为理解空值添加“逻辑”是一件可怕的事情。这种逻辑是底层.NET对象模型的一部分;这不是商业逻辑。
但是,您可以为模型中要显示的Ethnicity
类型的每个属性添加一个属性:
public Ethnicity Ethnicity {get;set;}
public string EthnicityName {
get {return Ethnicity == null ? String.Empty : Ethnicity.Name;}
set {if (Ethnicity != null) {Ethnicity.Name = value;}}
}
public int EthnicityCode {
get {return Ethnicity == null ? 0 : Ethnicity.Code;}
set {if (Ethnicity != null) {Ethnicity.Code = value;}}
}
然后视图根本没有工作要做。
请注意,我认为这种委托是可以的,而不是格式化。我永远不会在模型中添加属性,只是为了格式化。
答案 1 :(得分:1)
这似乎是一个类设计问题,而不是视图/模型问题。你有一个类声明它将在初始化时提供种族作为其不可变状态的一部分。但是,当您实际创建对象时,您并未为该类的使用者提供此保证。我认为@John Saunders解决方案是可行的,但我更愿意将种族默认实例作为种族类型的静态成员实例化并返回。该默认值的Name属性将返回“None Supplied”或类似内容的语言相应答案。
答案 2 :(得分:0)
您可能有兴趣在IDataErrorInfo
上实现ViewModel
接口,因此在那里实现验证逻辑而不是在属性getter / setter上。