Asp.net mvc 4 对于从dropdownlist中选择的属性,我的模型中是否应该同时包含文本和值
在ASP.NET MVC应用程序中,我有一个名为CarSearchCriteria的模型:Asp.net mvc 4 对于从dropdownlist中选择的属性,我的模型中是否应该同时包含文本和值,asp.net-mvc-4,properties,model,Asp.net Mvc 4,Properties,Model,在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} } 我有两个视图-一个
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属性的编辑视图中,我可以执行以下操作。我知道我本可以使用DropDownList,但暂时不想弄乱SelectList:
<select name="CarMake">
<option value="1">BMW</option>
<option value="2">Mercedes</option>
<option value="3">Toyota</option>
</select>
宝马
梅赛德斯
丰田
因此,模型绑定机制将轻松地将所选值绑定到适当的模型属性。但是阅读模式呢。我不能显示1或2。我需要展示宝马、奔驰等等。我的问题是,首选的方式是什么?我是否必须有一个属性名来保存实际的文本信息,比如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
的实例更像是一种操作(例如,从数据库获取),那么可能需要一些对象内缓存,以防您需要多次访问它:
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;
}
}
大卫的解决方案很好,但出于某种原因,我找到了自己的解决方案,以更好地满足我的需要,而且我觉得它更优雅。所以基本上我要做的是创建一个类,它保存所有属性的文本描述,这些属性只保留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.Someproperty,您将获得未设置为对象实例的对象引用。因此,不要忘记先将TextValues设置为某个初始化对象。只是一个善意的提醒,仅此而已