2016-12-19 149 views
2

嘿,我是Razor MVC的新手,想要制作一个内置了过去10年(2016年,2015年,2014年等)的选择框。ASP.net MVC 5剃须刀下拉框

这是我目前控制器代码:

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

我的剃刀代码:

@Html.DropDownList("last10Years", (SelectList)ViewBag["last10Years"], "--Select One--") 

但我有一个错误装载,说的页面时:

InvalidOperationException: There is no ViewData item of type 'IEnumerable' that has the key 'last10Years'.

所以...我错过了什么?

+0

附注:您可以SIM卡将产生'SelectList'的代码放大到'新的SelectList(Enumerable.Range(DateTime.Now.Year,10));' –

回答

3

这是我会怎么做视图

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

你可以看到一个演示here

以下来自你的评论请在下面找到我更新的答案。

我会先创建一个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 

和的beging下面我们DropDownList helper方法现在将变为指向特性在我们Model类作为

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

这工作,但如果我有它自己的功能,而不是**公共IActionResult指数()**,它会如何工作,因为我原来的问题有它自己的功能? – StealthRT

+0

@StealthRT从你当前的代码看起来好像你正在返回一个视图 – Izzy

+0

所以,而不是返回视图我会返回viewBag吗? – StealthRT

0

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

  • 不要命名ViewBag键相同DropDownList的名字,他们没有 工作得很好,你可以改变ViewBag键的名字像last10YearsOptions instead of last10Years`,所以它比控制不同名称。
  • 在添加到ViewBag之前,您还没有在控制器中创建SelectList,但是您在视图中将其转换为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) 
+0

所以** ViewData **应该是** ViewBag **? – StealthRT

+0

您的代码中有两到三个问题,我已更新该帖子。 –

+0

做所有上述我得到的错误:** RuntimeBinderException:不能应用[]的索引到'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.DynamicViewData'类型的表达式** – StealthRT

0

ViewBag是不是键值对的字典。 也DropDownList的工作与ICollection的我思 所以这个代码工作形式

@Html.DropDownList("last10Years", new SelectList(ViewBag.last10YearsOptions), "Select one from here") 
+0

生成错误:** ArgumentNullException:值不能为空。参数名称:items ** – StealthRT

0

控制器就在这里;

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--") 
+0

错误:** InvalidOperationException:没有类型为'IEnumerable '的,具有关键字'last10Years'的ViewData项** – StealthRT

+0

清除浏览器缓存并重试 –

+0

或者尝试不同的浏览器 –