【发布时间】:2014-11-14 15:03:42
【问题描述】:
我一直在尝试让 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 类型的项 具有键“GenreId”的“IEnumerable”
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 会更好一些,而且我无法让 HTML 属性在 DropDownList() 中正常工作。
谢谢!
编辑:内部控制器:
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; }
}
}
【问题讨论】:
-
SetGenreViewBag 在哪里被调用?
-
在控制器的 Create() 方法中。更新了问题以包含此内容。
-
请将
Create方法的代码加上[HttpPost]属性。 -
OK,在其他create方法中添加代码
-
保存表单时数据是否成功保存到数据库?
标签: c# asp.net asp.net-mvc html.dropdownlistfor dropdownlistfor