0

首先,很抱歉再次提出这个话题,这个话题之前在这个网站上已经讨论过很多次了——尽管我尽力了,但我就是无法让我的代码正常工作。

我有以下模型类:

public class ProjectsTable {
  public int ID {get; set;}
  public String ProjectName {get; set;}
  ...
  public virtual Manager Manager_Id {get; set;}  // Stores foreign key of Manager
}

public class Manager {
  public int ID {get; set;}
  public String ManagerName {get; set;}
  ...
  public virtual ICollection<ProjectsTable> Projects {get; set;}
}

ProjectsTable 控制器类包含以下方法来兼作显示和编辑页面:

private SynthContext db = new SynthContext();
...

// GET: /ProjectsTable/Parameters/5
public ActionResult Parameters(int id) {
  ProjectsTable projectstable = db.ProjectsTable.Find(id);
  ViewBag.Manager_Id = new SelectList(db.Manager, "ID", "ManagerName");
  return View(projectstable);
}

// POST: /ProjectsTable/Parameters/5
public ActionResult Parameters(ProjectsTable projectstable) {
  if(ModelState.IsValid) {
    db.Entry(projectstable).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Parameters");
  }
  ViewBag.Manager_Id = new SelectList(db.Manager, "ID", "ManagerName");
  return View(projectstable);
}

最后,Parameters.cshtml 包含以下代码来显示下拉菜单

@model Synth.Models.ProjectsTable
...
<fieldset>
...
  <div class="editor-lable">
    @Html.LabelFor(model => model.Manager_ID)
  </div>
  <div class="editor-field">
    @HTML.DropDownList("Manager_ID", String.Empty)
  </div>
  <input type="submit" value="Update">
</fieldset>

/ProjectsTable/Parameters/x当我测试代码时,我可以毫无问题地导航到;下拉列表正确生成,其中包含经理名称列表。但是,当我单击“更新”按钮时,Manager_ID 以红色突出显示,表示更改尚未注册。/ProjectsTable/list我可以通过导航到我发现没有任何更改生效的位置来确认更改尚未注册。

我试过添加@Html.ValidationMessageFor(Model.Manager_ID),结果总是“值'x'无效”,其中x是一个有效的ID值(我已经对照数据库检查过)。

我查看了生成的 HTML 源代码,也没有发现任何错误。

我怀疑我需要替换@HTML.DropDownList@HTML.DropDownListFor,但我无法弄清楚它需要哪些参数才能使其正常工作。 编辑 - 我现在已经设法开始DropDownListFor工作,但问题仍然存在。帮助我解决此问题的一个相关问题可能是如何查看发送回服务器的发布数据。

任何帮助将非常感激。

先谢谢大家了。。。

乔波

4

2 回答 2

0

我认为您自己很困惑,因为您有一个模型属性Manager_Id和一个 viewBag 对象Manager_Id。您的 modelState 错误指的是模型属性,而不是下拉列表中绑定到 viewBag 对象的任何值。我建议重新命名您的 ViewBag 以避免混淆(或者,更好的是,根本不使用 ViewBag),并为模型属性添加一个隐藏字段:

@Html.HiddenFor(m => m.Manager_Id) 

作为旁注,根据您对上述故障排除工作的描述,我还建议您在 Visual Studio 中进行调试、设置断点和检查值。从长远来看,这将使您的生活变得更加轻松。

于 2013-02-25T17:46:44.537 回答
0

所以我终于找到了问题所在。它与视图或控制器无关。显然我没有正确地编写模型:外键应该存储为int?以及指向相关模型的指针。

public class ProjectsTable {
  public int ID {get; set;}
  public String ProjectName {get; set;}
  ...

  public int? ManagerID {get; set;}  // Stores foreign key of Manager
  public virtual Manager Manager // I have no idea if this line does anything
}

public class Manager {
  public int ID {get; set;}
  public String ManagerName {get; set;}
  ...
  public virtual ICollection<ProjectsTable> Projects {get; set;}
}

虽然不是必需的,但 View 也受益于使用该功能:

Html.DropDownListFor(model => model.Manager_ID, ViewBag.Manager_Id as SelectList, String.Empty)

该函数@HTML.DropDownList("ManagerID", String.Empty)也可以工作,但是为了让它这样做,从控制器 ( ManagerID) 传递的 ViewBag 对象的名称必须与模型的外键完全匹配。这对我的口味来说令人费解和困惑。我更喜欢强类型的方法。

为了完整起见,我包含了完全更正的代码:

控制器:

private SynthContext db = new SynthContext();
...

// GET: /ProjectsTable/Parameters/5
public ActionResult Parameters(int id) {
  ProjectsTable projectstable = db.ProjectsTable.Find(id);
  // The following line has been amended, but this change is not strictly necessary
  ViewBag.m_id = new SelectList(db.Manager, "ID", "ManagerName", projectstable.ManagerID);
  return View(projectstable);
}

// POST: /ProjectsTable/Parameters/5
public ActionResult Parameters(ProjectsTable projectstable) {
  if(ModelState.IsValid) {
    db.Entry(projectstable).State = EntityState.Modified;
    db.SaveChanges();
    return RedirectToAction("Parameters");
  }
  ViewBag.m_id = new SelectList(db.Manager, "ID", "ManagerName", projectstable.ManagerID);
  return View(projectstable);
}

看法:

@model Synth.Models.ProjectsTable
...
<fieldset>
...
  <div class="editor-lable">
    @Html.LabelFor(model => model.ManagerID)
  </div>
  <div class="editor-field">
    Html.DropDownListFor(model => model.ManagerID, ViewBag.m_id as SelectList, String.Empty)
    @Html.ValidationMessageFor(model => model.ManagerID)
  </div>
  <input type="submit" value="Update">
</fieldset>
于 2013-02-26T12:59:14.160 回答