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

时间:2011-06-12 18:06:06

标签: c# asp.net-mvc

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

public class adminQViewModel
    {

        public SubTopic SubTopic { get; set; }
        public Answer   Answer { get; set; }

        public string Status { get; set; }

        [DisplayName("Status")]
        public IEnumerable<SelectListItem> 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.但是我想显示文本值。我可以创建另一个查找或硬编码然后我将复制数据存储在两个不同的地方的方式。

3 个答案:

答案 0 :(得分:1)

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

public class StatusSelectList : SelectList
{
    private static Dictionary<int, string> data = new Dictionary<int, string>
        { 
            { 0, "Release" }, 
            { 1, "Beta" }, 
            { 2, "Alpha" }, 
            { 3, "Draft" } 
        };

    public StatusSelectList()
        : base(data, "Key", "Value")
    {
    }
}

<强>更新

显示当前状态值的标签:

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

答案 1 :(得分:0)

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

    private IEnumerable<SelectListItem> _statusType;

    [DisplayName("Status")]
    public IEnumerable<SelectListItem> 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");

答案 2 :(得分:0)

编写自定义类:

public class StatusType : IEnumerable<KeyValuePair<int, string>>
{
      private readonly List<KeyValuePair<int, string>> entries = new List<KeyValuePair<int, string>>();

    public void Add(int key, string value)
    {
        this.entries.Add(new KeyValuePair<int, string>(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;
        }
    }
}