【问题标题】:Populate Data in DropDownList in Create Mode MVC 4在创建模式 MVC 4 中填充 DropDownList 中的数据
【发布时间】:2014-01-31 10:59:55
【问题描述】:

我正在尝试使用 MVC4 从 DropDownList 中的表中填充数据。试图弄清楚如何在编辑模式下将所有语言的标题放入下拉菜单。

型号:

public class CategoryLanguage
    {
        public int ID { get; set; }
        public int LanguageID { get; set; }
        public string Title { get; set; }
        public string Description { get; set; }
    }

public class Language
    {
        public int ID { get; set; }
        public string Title { get; set; }
    }

控制器:

public ActionResult Create()
        {
            using (MyDBContext db = new MyDBContext())
            {
                ViewBag.ID = new SelectList(db.Languages, "ID", "Title");
                return View();
            }
        }

        //
        // POST: /Emp/Create

        [HttpPost]
        public ActionResult Create(CategoryLanguage newCatLang)
        {
            using (MyDBContext db = new MyDBContext())
            {
                if (ModelState.IsValid)
                {
                    db.CategoryLanguages.Add(newCatLang);
                    db.SaveChanges();
                    return RedirectToAction("Index");
                }

                ViewBag.ID = new SelectList(db.Languages, "ID", "Title", newCatLang.LanguageID);
                return View(newCatLang);
            }
        }

查看:

@model MultilanguageCategories.CORE.Models.CategoryLanguage

@{
    ViewBag.Title = "Create";
}

<h2>Add New Item</h2>

@using (Html.BeginForm())
{
        @Html.ValidationSummary(true)

        @Html.DropDownList("ID", "--Select--")
}

试图弄清楚如何在创建新的 CategoryLanguage 实体时将所有语言的标题放入 DropDown。错误说:“操作无法完成,因为 DbContext 已被释放。”这行标记为:@Html.DropDownList("ID", "--Select--")

【问题讨论】:

  • 而不是ViewBag 尝试将其保存在Model
  • 你能给我一个样品吗?
  • Model 中添加一个字段选择列表字段,然后像这样尝试Model.ID=Select...
  • @Nilesh:你能说得更清楚些吗?
  • @StiliyanVasilev:检查我的答案。也许它可以帮助您解决问题。

标签: c# asp.net asp.net-mvc entity-framework asp.net-mvc-4


【解决方案1】:

如下所述更改您的获取方法“创建”

public ActionResult Create()
{
    var languages = new List<Language>();
    using (MyDBContext db = new MyDBContext())
    {
        languages = db.Languages.ToList();
    }

    ViewBag.ID = new SelectList(languages, "ID", "Title");
    return View();
}

现在您可以使用 DropDownListFor 如下所述:

@Html.DropDownListFor(model => model.[PropertyName], (IEnumerable<SelectListItem>)ViewBag.ID)

【讨论】:

  • 您无法在using 块之外获取languages 的值
  • 你确定吗?因为在这里发布答案之前,我首先编写示例代码并进行测试。
  • 太好了,您的代码在我的 SpiderCode 中完美运行。谢谢!
【解决方案2】:

你已经接近了......

您需要将语言选择列表添加到视图包中(您已经完成了,但是使用了一个错误命名的键)

即:ViewBag.LanguagesList = new SelectList(db.Languages, "ID", "Title");

如果您也想要一个足够简单的空字段:

var langs = db.Languages.ToList().ConvertAll(x => new SelectListItem() { Value = x.ID, Text = x.Title });
langs.Insert(0, new SelectListItem() { Value = "", Text = "--Select--" });
ViewBag.LanguagesList = langs;

DropdownList 应该是模型中的一个属性。

@Html.DropDownListFor(m => m.LanguageID, (IEnumerable<SelectListItem>)ViewBag.LanguagesList)

看起来您正在使用实体框架类作为模型,您需要确保在呈现视图之前不会释放上下文。

按照微软的例子link 在控制器顶部实例化上下文,并在 Create 方法中删除 using 语句。

即:

public class LanguageCategoryController : Controller
{
    MyDBContext db = new MyDBContext();

    public ActionResult Create()
    {
            ViewBag.LanguagesList = new SelectList(db.Languages, "ID", "Title");
            // or replace the above line with the other example above
            // if you want the empty "--select--" option

            return View();           
    }
}

【讨论】:

  • 谢谢,我已经这样做了,但它仍然有一个错误:“操作无法完成,因为 DbContext 已被释放”并以红色标记以下行:@Html.DropDownListFor(m = > m.LanguageID, (IEnumerable)ViewBag.LanguagesList)
  • 我将假设这是因为正在使用的模型是一个实体框架类,并且在加载视图之前就已经处理了上下文。如果您在此处查看 Microsoft 的示例:link 您会注意到上下文是在控制器类的顶部构造的,并且没有 using 语句(因此它只会在控制器被释放时才会被释放 - 这不会'直到视图被渲染之后才会发生)。我将更新我的答案以显示这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-30
相关资源
最近更新 更多