在ASP.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>
因此,模型绑定机制可以轻松地将所选值绑定到适当的模型属性。但阅读模式呢?我不能显示1或2。我需要展示宝马,梅赛德斯等。我的问题是什么是首选方式,我是否必须拥有一个包含实际文本信息的属性名称,如CarMakeText?
答案 0 :(得分:1)
您可以同时拥有标识符(您当前拥有的标识符)以及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;
}
}
答案 1 :(得分:0)
大卫的解决方案很好但是出于某种原因我找到了自己的解决方案以更好地满足我的需求,而且我发现它更优雅。基本上我所做的就是创建一个类,其中包含所有保留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。
P.S。我确信在初始化此属性之前,很多人会倾向于执行以下操作:
Employee emp=new Employee;
emp.Age=25;
emp.TextValues.DepartmentName="Engineering";// Don't do this
如果您尝试访问或设置Textvalues.Someproperty,您将获得Object reference not set to an instance of an object
。所以不要忘记首先将TextValues设置为某个初始化对象。只是一个提醒,这就是全部。