我一直在尝试使用另一个表中的值将DropDownListFor用于ASP.NET MVC,以将模型链接到所选的选项。完全披露,我很少知道我正在做什么,只是在处理示例。
按如下方式创建DropDownList:
@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" })
GenreId是模型表中的一列。
我收到错误:
在进入视图之前,发生了'System.InvalidOperationException'类型的异常 System.Web.Mvc.dll但未在用户代码中处理
其他信息:没有类型的ViewData项 'IEnumerable'具有键'GenreId'
ViewBag设置如下:( Id和name是Genre表中的列)
private void SetGenreViewBag(int? GenreId= null)
{
if (GenreId== null)
ViewBag.GenreSelect= new SelectList(db.Genres, "Id", "name");
else
ViewBag.GenreSelect = new SelectList(db.Genres, "Id", "name", GenreId);
}
该模型有一个类型Id的列。
我认为我的主要问题是我不理解DropDownListFor函数的语法,而且还有十几个不同的重载因此很难解密。 lambda的第一个参数的目的是什么?它似乎从选择列表值中获取您指定的值,但我不知道它如何连接到模型。没有在网上找到明确的答案。
我以为我有这个工作,但我做的事情让它停止工作。我之前还使用DropDownList()进行了工作,但是我看到DropDownListFor会更好一点,而且我无法在DropDownList()中正常运行HTML属性。
谢谢!
编辑:内部控制器:
public ActionResult Create()
{
SetGenreViewBag();
return View();
}
注意:下拉列表会显示所有正确的项目(即流派),但在保存表单时崩溃。
// POST: Home/Create
[HttpPost]
public ActionResult Create(Song songToCreate)
{
try
{
db.Songs.Add(songToCreate);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
歌曲模型:
namespace MyModule.Models
{
using System;
using System.Collections.Generic;
public partial class Song
{
public int Id { get; set; }
public string name { get; set; }
public int genreId { get; set; }
}
}
答案 0 :(得分:1)
当你有这个语法时
@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" })
第一个参数指示将为模型的哪个属性分配下拉列表的选定值,在这种情况下为GenreId
。我没有看到您生成下拉列表的方式有任何问题,但由于您在保存表单时遇到错误,我认为问题出在Create
方法中,其中包含[HttpPost]
属性。< / p>
[HttpPost]
public ActionResult Create(Song songToCreate)
{
try
{
db.Songs.Add(songToCreate);
db.SaveChanges();
return RedirectToAction("Index");
}
catch
{
return View();
}
}
我猜在try
块内部由于某种原因发生错误,然后执行catch
块中的代码并返回到同一页面,但ViewBag.GenreSelect
已经消失了,你得到了There is no ViewData item of type 'IEnumerable' that has the key 'GenreId'
错误。尝试在SetGenreViewBag()
块中添加catch
,以便重新填充ViewBag.GenreSelect
。同时将(Exception ex)
添加到catch
块,以找出try
块中的错误
[HttpPost]
public ActionResult Create(Song songToCreate)
{
try
{
db.Songs.Add(songToCreate);
db.SaveChanges();
return RedirectToAction("Index");
}
catch (Exception ex)
{
SetGenreViewBag();
return View();
}
}