【问题标题】:How do I create a reusable dropdown list如何创建可重复使用的下拉列表
【发布时间】:2017-01-19 16:07:18
【问题描述】:

我创建了一个非常简单的下拉列表,它基本上显示了不同的时间,它们的值是每次午夜过后的分钟数。例如:

Value       Time
60          01:00 AM
75          01:15 PM
90          01:30 PM
105         01:45 PM
120         02:00 PM

问题是,我需要在我的应用程序的一大堆视图和控制器中使用相同的下拉列表。在阅读了几篇文章之后,似乎我需要为此创建一个静态类?但是所有的例子似乎都比我实际需要的复杂得多。我应该为此创建一个IList 吗?

【问题讨论】:

  • 你在你的 mvc 实现中使用了任何 IoC 吗?

标签: c# asp.net-mvc html-select


【解决方案1】:

你可以试试下面的方法

  1. 创建一个静态类,为下拉菜单生成数据源
public static class DropdownData
{
    public static IList<SelectListItem> GetTimeList(string defaultValue)
    {
        var times = new List<SelectListItem>();
        times = Enumerable.Range(4, 4).Select(x => {
            var minute = x * 15;
            var time = DateTime.Today.AddMinutes(minute);
            return new SelectListItem()
            {
                Value = minute.ToString(),
                Text = time.ToString("hh:mm tt"),
                Selected = (!string.IsNullOrEmpty(defaultValue) && minute.Equal(defaultValue))
            };
        }).ToList();
        return times;
    }
}
  1. 在您的视图中,您可以使用步骤 1 中生成的数据源创建下拉列表
@Html.DropDownList("TimeList", DropdownData.GetTimeList("75"), new { @class = "form-control" })

【讨论】:

  • 这很完美!如何更改是在 24 小时内每隔 15 分钟列出一次?只是改变范围?
  • 您可以更改为 Enumerable.Range(1, 96)(24 小时 = 15 分钟的 96 次)
  • 谢谢@Trung。我不认为您知道我如何使用这种方法选择默认值。是否可以?我应该在视图中还是在列表的构造中选择默认值?
  • 我在哪里传递那个'defaultValue'呢?
  • 您可以在视图中传递它,例如调用 DropdownData.GetTimeList("75") 将生成下拉菜单,并选择第二个项目。
【解决方案2】:

如果您需要一个值为Global,那么是的,您会希望它在C# 中为public static。我建议您也将它放在public static class 中,以便您可以按名称访问它。

public static class MyData
{
     public static IEnumerable<DateTime> ValueTimes { get; set;} //(or IList or List<T> or whatever you want)     
}

public class IDoStuff
{
  public DateTime myTime { get; set; }
  public IDoStuff(DateTime d) //constructor
  {
     if(ValueTimes.IndexOf(d) != -1) //-1 says I no findie
        myTime = d;
     else
        throw new ApplicationException("That's not a valid time, dummy");
  }
}

看,很容易。此外,请使用DateTimeTimeSpan,即使它们都在同一天。不要用strings代表时间,那样是自找麻烦。

编辑:当我提出解决方案时,您发布了示例数据。鉴于此:

Value       Time
60          01:00 AM
75          01:15 PM
90          01:30 PM
105         01:45 PM
120         02:00 PM

我认为您实际上可以这样做并跳过静态变量:

public static Timespan GetTime(int value)
{
   return Timespan.FromMinutes(value);

}

【讨论】:

  • 另一种选择是将它添加到基础 Controller 类中,并让您的所有控制器都从该基类继承,或者使用 Cache 或其他中间层来存储它(如 HttpCache 或 Redis)。这样可以避免在 Web 代码中使用静态变量,这让我感觉很脏 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2012-11-02
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-03-22
相关资源
最近更新 更多