【问题标题】:Can't get DropdownListFor to work properly无法让 DropdownListFor 正常工作
【发布时间】: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


【解决方案1】:

当你有这个语法时

@Html.DropDownListFor(model => model.GenreId, (SelectList)ViewBag.GenreSelect, new { @class = "form-control" })

第一个参数表示模型的哪个属性将被分配下拉列表的选定值,在本例中为GenreId。我看不出您生成下拉列表的方式有什么问题,但是由于您在保存表单时遇到错误,我认为问题出在 Create 方法内部,下面有 [HttpPost] 属性。

[HttpPost]
public ActionResult Create(Song songToCreate)
{
    try
    {
        db.Songs.Add(songToCreate);
        db.SaveChanges();
        return RedirectToAction("Index");
    }
    catch
    {
        return View();
    }
}

我猜想在try 块内由于某种原因发生了错误,然后catch 块中的代码被执行并返回到同一页面但ViewBag.GenreSelect 已经消失所以你得到@ 987654329@ 错误。尝试在catch 块内添加SetGenreViewBag(),以便重新填充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();
    }
}

【讨论】:

  • 好的,所以现在它不会崩溃,而是重新加载页面并且不保存任何内容。没有解决根本问题,这与我如何创建 ViewBag 选择列表和/或 DropDownListFor 行(发生崩溃的地方)有关。
  • 如何创建ViewBag和使用DropDownListFor没问题,错误是因为您在保存表单后返回同一页面时没有重新填充ViewBag.GenreSelect
  • 表格不保存。
  • 现在我们需要找出try 块内发生的错误。把catch块改成catch (Exception ex),然后调试看看ex.Message的值是什么。
  • 一个或多个实体的验证失败。有关详细信息,请参阅“EntityValidationErrors”属性。
猜你喜欢
  • 2012-09-05
  • 2017-11-06
  • 2011-09-06
  • 2023-03-10
  • 2020-10-16
  • 2014-01-15
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多