[英]ASP.net MVC 5 Razor dropdown box
嘿,我是Razor MVC的新手,我想制作一个选择框,其中列出了过去10年(2016、2015、2014等...)。
这是我当前的控制器代码:
public ActionResult loadPast10Years()
{
List<int> last10Years = new List<int>();
int currentYear = DateTime.Now.Year;
for (int i = currentYear - 10; i < currentYear; i++)
{
last10Years.Add(i);
}
ViewBag["last10Years"] = last10Years;
return View();
}
还有我的Razor代码:
@Html.DropDownList("last10Years", (SelectList)ViewBag["last10Years"], "--Select One--")
但是加载页面时出现错误:
InvalidOperationException:没有类型为“ IEnumerable”的ViewData项目具有键“ last10Years”。
所以...我想念什么?
这就是我认为的方式
@Html.DropDownList("Last Ten Years", (IEnumerable<SelectListItem>)ViewBag.LastTenYears, "Select A Year")
和你的Action
List<int> last10Years = new List<int>();
int currentYear = DateTime.Now.Year;
for (int i = currentYear - 10; i < currentYear; i++)
{
last10Years.Add(i);
}
ViewBag.LastTenYears = new SelectList(last10Years);
你可以在这里看到一个演示
根据您的评论,请在下面找到我的最新答案。
首先,我将创建一个Model
类,该类将在我们的视图中使用。 在此模型类中,您可以具有适当的属性。 现在,我们只使用SelectlistItem
所以我们的班级看起来像
public class ViewModel
{
public IEnumerable<SelectListItem> LastTenYears { get; set; }
}
然后,在我们的控制器中,我们可以创建一个方法,该方法将为我们的下拉菜单提供信息。
public IEnumerable<SelectListItem> GetLastTenYears()
{
List<SelectListItem> ddl = new List<SelectListItem>();
int currentYear = DateTime.Now.Year;
for (int i = currentYear - 10; i < currentYear; i++)
{
ddl.Add(new SelectListItem { Text = i.ToString(), Value = i.ToString() });
}
IEnumerable<SelectListItem> lastTenYears = ddl;
return lastTenYears;
}
现在我们要将这些数据传递给视图。 为了论证,我将使用Index
作为视图,但是您可以将其传递给您喜欢的任何视图。 因此,我们将把Index
操作更改为
public ActionResult Index()
{
ViewModel viewModel = new ViewModel();
viewModel.LastTenYears = GetLastTenYears(); //get the drop down list
return View(viewModel); //we're passing our Model to the view
}
最后,我们要确保我们的视图知道要使用的Model
,因此我们将按照Index.cshtml
文件的开头进行以下操作
@model YourNameSpace.ViewModel
并且我们的DropDownList
帮助器方法现在将更改为指向Model
类中的属性,如下所示:
@Html.DropDownList("Last Ten Years", Model.LastTenYears, "Please select a year")
现在,您的代码中几乎没有问题。
instead of
last10Years`,以使其与控件名称不同。 ViewBag
之前, ViewBag
在控制器中创建SelectList
,但您正在将其强制转换为View中的SelectList
。 ViewBag
值的存储方式类似于ViewBag.SomeKey= "SomeValue"
,但是这样做的方式是错误的。 解决上述问题后,您的代码将如下所示:
ViewBag.last10YearsOptions = last10Years.Select(x => new SelectListItem()
{
Text = x.ToString(),
Value = x.ToString()
}
);
然后在视图中:
@Html.DropDownList("last10Years",
"--Select One--",
ViewBag.last10YearsOptions as IEnumerable<SelectListItem>,
null )
ViewBag
不是具有键值对的字典。 DropDownList也可以与ICollection ithink一起使用,因此此代码适用于以下形式
@Html.DropDownList("last10Years", new SelectList(ViewBag.last10YearsOptions), "Select one from here")
控制器在这里;
public ActionResult loadPast10Years()
{
List<int> last10Years = new List<int>();
int currentYear = DateTime.Now.Year;
for (int i = currentYear - 10; i < currentYear; i++)
{
last10Years.Add(i);
}
ViewBag.last10Years = new SelectList(last10Years);
return View();
}
和视图
@Html.DropDownList("last10Years", "--Select One--")
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.