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 Controller クラスには、表示および編集ページとしても機能する次のメソッドが含まれています。

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

だから私はついに問題を見つけました。ビューやコントローラーとは何の関係もありませんでした。モデルを適切に書き上げていなかったようです。外部キーは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)も機能しますが、そのためには、コントローラーから渡される ViewBag オブジェクトの名前 ( ManagerID) がモデルの外部キーと正確に一致する必要があります。これは複雑で、私の好みでは混乱します。私は強く型付けされたアプローチを好みます。

完全を期すために、完全に修正されたコードを含めます。

コントローラ:

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 に答える
0

モデル プロパティManager_Idと viewBag オブジェクトがあるため、混乱していると思いますManager_Id。modelState エラーは、viewBag オブジェクトにバインドされているドロップダウン リストの値ではなく、モデル プロパティを参照しています。混乱を避けるために ViewBag の名前を変更し (または、ViewBag をまったく使用しないことをお勧めします)、モデル プロパティの非表示フィールドを追加することをお勧めします。

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

補足として、上記のトラブルシューティング作業の説明から、Visual Studio でのデバッグ、ブレークポイントの設定、値の検査に慣れることもお勧めします。長期的には、あなたの人生をとても楽にしてくれます。

于 2013-02-25T17:46:44.537 に答える