繁体   English   中英

ASP.net MVC 5 Razor下拉框

[英]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")

现在,您的代码中几乎没有问题。

  • 不要将ViewBag键的名称与DropDownList名称相同,它们不能很好地协同工作,您可以将ViewBag键的名称更改为诸如last10YearsOptions之类的名称, 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM