我看了一眼:
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();
}
有人可以帮忙吗?
感谢
答案 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();
}
这取决于您的显示格式。我要指出的是DateTime
和SelectListItem
可能没有隐式强制转换,因此在运行时会出现类型不匹配。
答案 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上!