Asp.net mvc 4 对于从dropdownlist中选择的属性,我的模型中是否应该同时包含文本和值

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} } 我有两个视图-一个

在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属性的编辑视图中,我可以执行以下操作。我知道我本可以使用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设置为某个初始化对象。只是一个善意的提醒,仅此而已