ASP MVC3 ドロップダウン リストに選択可能な項目を 2 つだけ入力し、データベースの値に基づいて選択する項目を決定しようとしています。これまでのところ、これが私の見解です(これは正しいと思います)
<div class="editor-label">
@Html.LabelFor(model => model.Status)
</div>
<div class="editor-field">
@Html.DropDownList("CategoryID")
</div>
しかし、コントローラーで値を取得および設定する際に問題が発生しています。
まず、私が使用している方法は、最初にリストされているドロップダウンリストの値のみを選択しているようですSelectListItem
。
public ActionResult Edit(int id)
{
//redirect if security is not met. Must be admin here
if (!Security.IsAdmin(User)) return RedirectToAction("Message", "Home", new { id = 1 });
var item = db.FollowUpItems.Find(id);
string start = string.Empty;
if (item.Status.Equals("O")) start = "Open";
else start = "Closed";
ViewBag.CategoryID = new SelectList(new[]
{
new SelectListItem {Text = "O", Value = "Open"},
new SelectListItem {Text = "C", Value = "Closed"},
},"Text", "Value", start);
FollowUpItems followupitems = db.FollowUpItems.Find(id);
return View(followupitems);
}
次に、Save
編集ページのボタンをクリックすると、コントローラーのこの部分に渡されるのStatus
プロパティが常に null になります。FollowUpItem
[HttpPost]
public ActionResult Edit(FollowUpItems followupitems)
{
try
{
if (ModelState.IsValid)
{
db.Entry(followupitems).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
}
catch (DbEntityValidationException dbEx)
{
ViewBag.ErrorMessage = Common.ErrorCheck.CombineDbErrors(dbEx);
}
catch (Exception ex)
{
ViewBag.ErrorMessage = ErrorCheck.FriendlyError(ex);
}
return View(followupitems);
}
編集
以下のGET
クイントンの回答のおかげで問題は解決しましたが、値の設定にはまだ問題があります。この@Html.DropDownList("CategoryID")
メソッドを使用するnull
と、毎回コントローラーに値が返されます (Status 値の場合、他の値はすべて正常です)。@Html.DropDownListFor(m => m.Status, ViewBag.CategoryID)
構文を使用すると、次のエラー メッセージが表示されます。
'コンパイラ エラー メッセージ: CS1973: 'System.Web.Mvc.HtmlHelper' には 'DropDownListFor' という名前の適用可能なメソッドがありませんが、その名前の拡張メソッドがあるようです。拡張メソッドは動的にディスパッチできません。動的引数をキャストするか、拡張メソッド構文なしで拡張メソッドを呼び出すことを検討してください。
最終編集
ビューの次のキャストにより、値を適切に設定できました
@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)