如何重用我创建的代码来保存选择列表项

我有以下代码是MVC中的视图模型

public class adminQViewModel { public SubTopic SubTopic { get; set; } public Answer Answer { get; set; } public string Status { get; set; } [DisplayName("Status")] public IEnumerable StatusType { get { return new[] { new SelectListItem { Value = "0", Text = "Release" }, new SelectListItem { Value = "1", Text = "Beta" }, new SelectListItem { Value = "2", Text = "Alpha" }, new SelectListItem { Value = "3", Text = "Draft" }, }; } } } 

当我检索值并显示文本等价物时,我在其他地方使用相同的值和文本组合。 有没有办法可以封装这个值的组合:texzt并在其他地方使用它加上我的选择下拉列表?

一个例子是当我返回在视图中显示的数据时。 数据包含状态代码的值,例如0,1,2和3.但是我想显示文本值。 我可以创建另一个查找或硬编码然后我将复制数据存储在两个不同的地方的方式。

我建议你在视图中使用SelectLists和辅助方法@Html.DropDownListFor(m => m.Status, new StatusSelectList())

 public class StatusSelectList : SelectList { private static Dictionary data = new Dictionary { { 0, "Release" }, { 1, "Beta" }, { 2, "Alpha" }, { 3, "Draft" } }; public StatusSelectList() : base(data, "Key", "Value") { } } 

更新:

显示当前状态值的标签:

  1. 使用UIHint属性在视图模型中装饰属性: [UIHint("DropDownList")]
  2. 将选择列表设置为ViewBag.SelectLists = new Dictionary { "Status", new StatusSelectList() };
  3. 使用@Html.DisplayFor(m => m.Status)显示当前状态值的标签。

您可以在私有属性中设置一次,然后在每个后续请求中返回它。 这称为延迟加载 :

  private IEnumerable _statusType; [DisplayName("Status")] public IEnumerable StatusType { get { if (_statusType == null) { _statusType = new[] { new SelectListItem { Value = "0", Text = "Release" }, new SelectListItem { Value = "1", Text = "Beta" }, new SelectListItem { Value = "2", Text = "Alpha" }, new SelectListItem { Value = "3", Text = "Draft" }, }; } return _statusType; } } 

此外,如果您在不同的用户会话之间重复使用相同的列表,那么将其设置为静态属性可能是有意义的,这样它就可以实例化一次并继续使用,直到应用程序池被回收/重新启动。

更新

您可以使用一点LINQ来检索所需的文本。 例如,要根据值2获取“Alpha”:

 string text = StatusType.SingleOrDefault(s => s.Value == "2"); 

写一个自定义类:

 public class StatusType : IEnumerable> { private readonly List> entries = new List>(); public void Add(int key, string value) { this.entries.Add(new KeyValuePair(key, value)); } public string this[int key] { get { foreach (var kvp in this.entries) { if (string.Compare(kvp.Key, key, StringComparison.Ordinal) == 0) { return kvp.Value; } } return null; } } }