【问题标题】:ASP.Net MVC Object Reference in Edit View when using DropDownListFor()使用 DropDownListFor() 时编辑视图中的 ASP.Net MVC 对象引用
【发布时间】:2010-05-02 21:34:00
【问题描述】:

这个问题与我最近问的另一个问题有关,可以找到here了解一些背景信息。

这是Edit ActionResult中的代码:

    public virtual ActionResult Edit(int id)
    {
        ///Set data for DropDownLists.
        ViewData["MethodList"] = tr.ListMethods();
        ViewData["GenderList"] = tr.ListGenders();
        ViewData["FocusAreaList"] = tr.ListFocusAreas();
        ViewData["SiteList"] = tr.ListSites();
        ViewData["TypeList"] = tr.ListTalkbackTypes();
        ViewData["CategoryList"] = tr.ListCategories();

        return View(tr.GetTalkback(id));
    }

我将列表添加到 ViewData 以在下拉列表中使用,这些都是 IEnumerable 并且都是返回值。

GetTalkback() 返回从 Talkback 表生成的 Talkback 类型的实体框架对象。

DropDownListFor 代码为:

<%: Html.DropDownListFor(model=>model.method_id,new SelectList(ViewData["MethodList"] as IEnumerable<SelectListItem>,"Value","Text",Model.method_id)) %>

我正在查看的记录在所有字段中都有值。当我在视图上单击提交时,我得到一个未设置为对象实例的对象引用。上面一行的错误。

在此之前的表单中有许多标准字段,因此该错误仅发生在下拉列表中,并且在所有下拉列表中都发生。

有什么想法吗?这是我第一次涉足 MVC、C# 和 Entity,所以我完全迷失了!

【问题讨论】:

  • “当我在视图上单击提交时”是什么意思?
  • 对不起,如果我不是很清楚。当我调试并导航到编辑视图时,它会显示正确的记录。如果我然后在编辑页面上单击“保存”,则会出现错误。

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


【解决方案1】:

如果你有 [HttpPost] 这样的方法

[HttpPost]
public ActionResult Edit(Talkback model)
{
    //Do something with model
    return View(model);
}

您必须再次填写 ViewData。如果你不这样做,你将会有Object reference not set to an instance of an object 错误。

最好的做法是遵循 POST-REDIRECT-GET 模式并这样做:

[HttpPost]
public ActionResult Edit(Talkback model)
{
    //Do something with model
    return RedirectToAction("Edit", new { id = model.id });
}

您将通过[HttpGet] 方法再次填充 ViewData。

【讨论】:

  • 现在我得到“无法将具有空 EntityKey 值的对象附加到对象上下文。”看起来一个空的对讲被传回控制器,而不是我发送到 HTTPGet 上的编辑视图的那个。默认的 HTTPPost 签名是“int id,FormCollection 集合”,我将其更改为 Talkback 模型,是否需要在视图中做一些额外的工作才能将其连接起来?
  • @hermiod:你只取回你在表格中放置的东西。你没有得到完整的模型。 model.Id 是否在回发中设置?有id的属性怎么调用?
  • 我在 HTTPGet ActionResult 上传递了一个 Talkback 对象以进行编辑。所有字段都显示在表单上,​​包括 ID 字段,在 Talkback 对象中称为talkback_id。禁止我将某些字段更改为下拉菜单,表单上的所有代码都是默认生成的。页面的 BeginForm 是默认的:Html.BeginForm()。我已经看到了这种改变的例子,这是我需要在这里做的吗?抱歉,我对这个主题几乎完全无知,我仍在学习。
  • @hermiod:您必须确保 html 输入元素的 name 与模型中的属性名称匹配 (Talkback)。如果名称不匹配,它将无法按预期工作。
  • 输入的名字都是正确的。我正在使用 TextboxFor、EditorFor 和 DropDownListFor,所以这些都是自动设置的。我检查了输出 HTML 以确保它们都是正确的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-31
  • 1970-01-01
  • 2018-09-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多