【问题标题】:Should I have both text and value in my model for a property that is selected from dropdownlist对于从下拉列表中选择的属性,我是否应该在模型中同时包含文本和值
【发布时间】:2014-08-15 23:31:59
【问题描述】:

在 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>

因此模型绑定机制将很容易将选定的值绑定到适当的模型属性。但是阅读模式呢。我不能显示 1s 或 2s。我需要展示宝马、奔驰等。我的问题是首选方式是什么,我是否必须拥有一个包含实际文本信息的属性名称,例如 CarMakeText?

【问题讨论】:

    标签: asp.net-mvc-4 properties model


    【解决方案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;
        }
    }
    

    【讨论】:

      【解决方案2】:

      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.Someproperty,您将获得 Object reference not set to an instance of an object。所以不要忘记首先将 TextValues 设置为某个已初始化的对象。只是一个善意的提醒,仅此而已。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-09-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-22
        相关资源
        最近更新 更多