无法使DropdownListFor正常工作

时间:2014-11-14 15:03:42

标签: c# asp.net asp.net-mvc html.dropdownlistfor dropdownlistfor

我一直在尝试使用另一个表中的值将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; }
    }
}

1 个答案:

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