. NET MVC应用程序我有一个名为CarSearchCriteria的模型:
public class CarSearchCriteria{
public int CarMake {get;set;} // This is selected from a dropdownlist
public int YearOfFirstReg {get;set;}
public string ModelVariant {get;set}
}
我有两个视图——一个用于编辑,另一个用于查看。在CarMake属性的编辑视图中,我可以执行以下操作。我知道我可以使用DropDownListFor,但暂时不想与SelectList混淆:
<select name="CarMake">
<option value="1">BMW</option>
<option value="2">Mercedes</option>
<option value="3">Toyota</option>
</select>
因此,模型绑定机制将很容易地将选择的值绑定到适当的模型属性。但是阅读模式呢?我不能显示出15或25。我需要展示宝马、奔驰等等。我的问题是什么是首选的方式,我是否必须有一个属性名称来保存实际的文本信息,如CarMakeText? 您可以同时拥有标识符(您目前拥有)和Make
对象本身。在构建模型时永远不需要访问后者,但是在读取模型时可以访问后者。惰性加载的只读属性通常可以很好地解决这个问题。像这样:
public int CarMakeID { get; set; }
public Make CarMake
{
get
{
if (CarMakeID == default(int))
return null;
// fetch the Make from data and return it
}
}
当然,这在很大程度上取决于Make
实际上是什么以及你从哪里得到它。如果在内存中的某个地方有一些列表,那应该没问题。如果获取Make
的一个实例是一个操作(比如,从数据库中获取),那么也许一些对象内缓存将是为了防止你需要多次访问它:
public int CarMakeID { get; set; }
private Make _carMake;
public Make CarMake
{
get
{
if (CarMakeID == default(int))
return null;
if (_carMake == null)
// fetch the Make from data and save it to _carMake
return _carMake;
}
}
David的解决方案很好,但由于某种原因,我发现我自己的解决方案更适合我的需要,而且我觉得它更优雅。我所做的就是创建一个类它保存所有属性的文本描述只保留ID。例如,我有以下模型:
public class EmployeeModel{
public int EmployeeID {get;set;}
public string FullName {get;set}
*public int DepartmentID {get;set}
*public int SpecialityID {get;set;}
public int Age {get;set;}
}
用星号标记的属性是保留可能的许多预定义选项的id的属性,在显示时,我们应该显示实际的描述,而不是数字表示。为此,我们创建了一个单独的类:
public class EmployeeTextValues{
public string DepartmentName {get;set;}
public string SpecialityName {get;set;}
}
然后我把这个类作为属性添加到模型中:
public EmployeeTextValues TextValues {get;set;}
之后,从任何地方访问它都很容易,包括Razor。
注:我相信很多人在初始化这个属性之前会倾向于做以下事情:
Employee emp=new Employee;
emp.Age=25;
emp.TextValues.DepartmentName="Engineering";// Don't do this
如果您试图访问或设置Textvalues。你会得到Object reference not set to an instance of an object
。所以不要忘记首先将TextValues设置为一些初始化的对象。只是一个善意的提醒,仅此而已。