我应该有文本和值在我的模型从下拉列表中选择的属性



. 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设置为一些初始化的对象。只是一个善意的提醒,仅此而已。

相关内容

最新更新