0

我看过这个:

ASP.NET MVC - 如何将数组传递给视图?

并且正在努力将我的 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();
}

有人可以帮忙吗?谢谢

4

3 回答 3

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();
}

这取决于您的显示格式。我要指出的是,DateTime并且SelectListItem可能没有隐式转换,因此您在运行时会遇到类型不匹配。

于 2012-08-03T13:37:21.610 回答
1

如果您曾经认为(实现)像ViewData/这样的动态魔法变量ViewBag是邪恶的,并且考虑为您的视图使用强类型 ViewModel,您可以这样做

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

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 不好。它使您的代码难看。坚持强类型。

于 2012-08-03T13:44:43.087 回答
0

您将列表转换为IEnumerable<SelectListItem>,但它是一个日期时间列表。将列表投射到IEnumerable<DateTime>应该修复它。

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

于 2012-08-03T13:34:45.030 回答