c# - ASP.net MVC 5 Razor 下拉框

标签 c# asp.net asp.net-mvc razor asp.net-mvc-5

嘿,我是 Razor MVC 新手,想要制作一个选择框,其中列出了过去 10 年(2016 年、2015 年、2014 年等......)。

这是我当前的 Controller 代码:

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: There is no ViewData item of type 'IEnumerable' that has the key 'last10Years'.

那么...我错过了什么?

最佳答案

这就是我在 View 中执行此操作的方式

@Html.DropDownList("Last Ten Years", (IEnumerable<SelectListItem>)ViewBag.LastTenYears, "Select A Year")

并在您的操作

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

您可以观看演示 here

根据您的评论,请在下面找到我更新的答案。

我首先创建一个我们将在 View 中使用的Model 类。在这个模型类中,您可以拥有适当的属性。目前我们只使用 SelectlistItem

所以我们的类看起来像

public class ViewModel
{
    public IEnumerable<SelectListItem> LastTenYears { get; set; }
}

然后在我们的 Controller 中我们可以创建一个方法来为我们的下拉列表提供信息。

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

现在我们想要将此数据传递给 View 。为了论证起见,我将使用 Index 作为 View ,但您可以将其传递给您喜欢的任何 View 。因此,我们将 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
}

最后,我们希望确保我们的 View 知道要使用哪个 Model,因此我们将在 Index.cshtml 文件的开头执行以下操作

@model YourNameSpace.ViewModel

我们的 DropDownList 辅助方法现在将更改为指向 Model 类中的属性

@Html.DropDownList("Last Ten Years", Model.LastTenYears, "Please select a year")

关于c# - ASP.net MVC 5 Razor 下拉框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41224512/

相关文章:

asp.net - session变量清除方法只会清除当前浏览器session吗?

ASP.NET。如何修改返回的 JSON (actionfilter)

c# - SubSonic 3.0 简单存储库向对象添加 DateTime 属性

c# - VS 代码中的 "Cannot find or open the PDB file"

c# - 使用 LINQ 从 2 个列表中返回列表

c# - 为 DropDownList 的第一个条目添加一个空白值

c# - 如何在c#中动态添加文本到span控件

c# - 为什么没有 linq for byte, uint?

javascript - 自动完成列表固定位置浏览器调整大小

c# - 在调用 Controller 的方法之前执行代码?