将DateTime []传递给视图以在视图中作为下拉列表进行部署

时间:2012-08-03 13:30:52

标签: asp.net-mvc-3

我看了一眼:

ASP.NET MVC - How to pass an Array to the view?

并且我正在将我的DateTime []部署为视图中的下拉列表,这是我的行,但它不正确:

<p style="color:Red"><%: Html.DropDownList("Choose a Sunday: ", (IEnumerable<SelectListItem>)ViewData["Sundays"], "--Select--")%>
</p>

在控制器中我有:

[HttpGet]
public ActionResult MyAction()
{
  DateTime[] allSundaysInMonth = GetDatesOfSundays(System.DateTime.Now);
  ViewData["Sundays"] = allSundaysInMonth;
  return View();
}
有人可以帮忙吗? 感谢

3 个答案:

答案 0 :(得分:1)

也许您想要做的是:

[HttpGet]
public ActionResult MyAction()
{
  IEnumerable<SelectListItem> allSundaysInMonth = GetDatesOfSundays(System.DateTime.Now).Select(day => new SelectListItem() { Text = day.ToString(), Value = day.ToString() });
  ViewData["Sundays"] = allSundaysInMonth;
  return View();
}

这取决于您的显示格式。我要指出的是DateTimeSelectListItem可能没有隐式强制转换,因此在运行时会出现类型不匹配。

答案 1 :(得分:1)

如果你认为(实现)动态魔术变量如ViewData / ViewBag是邪恶的,并考虑使用强类型的ViewModel进行视图,你可以这样做

为您的视图(UI)创建特定的ViewModel

public class EventViewModel
{
  public IEnumerable<SelectListItem> AllSundays { set;get;}
  public string SelectedSunday { set;get;}
}

在您的操作方法中,设置值并将其发送到视图

public ActionResult MyAction()
{
  var vm=new EventViewModel();
  vm.AllSundays = GetDatesOfSundays(System.DateTime.Now).
          Select(d => new SelectListItem() {
            Text = d.ToString(), Value = d.ToString() }).ToList();

  return View(vm);
}

像这样改变你的观点

@model EventViewModel
@Html.DropDownListFor(x => x.SelectedSunday, Model.AllSundays, "--Select One--")

ViewBag / ViewData不好。它会让你的代码变得丑陋。坚持强打字。

答案 2 :(得分:0)

您将列表转换为IEnumerable<SelectListItem>,但它是一个DateTimes列表。将列表强制转换为IEnumerable<DateTime>应修复它。

或者您可能希望将SelectListItem的列表放在ViewData上!