我正在尝试仅使用两个可选项目填充 ASP MVC3 下拉列表,并根据数据库中的值确定要选择的项目。到目前为止,这就是我的观点(我认为这是正确的)
<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
属性始终为空。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)