我正在尝试使用两个可选项填充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
的{{1}}属性始终为null。
FollowUpItem
修改
由于Quinton的答案, [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")
值(对于Status值,所有其他值都应该如此),并使用null
语法导致以下错误消息:
&#39;编译器错误消息:CS1973:&#39; System.Web.Mvc.HtmlHelper&#39;没有适用的方法名称&#39; DropDownListFor&#39;但似乎有一个名称的扩展方法。无法动态分派扩展方法。考虑转换动态参数或调用扩展方法而不使用扩展方法语法。&#39;
最终编辑
我的视图中的以下演员表允许我正确设置值
@Html.DropDownListFor(m => m.Status, ViewBag.CategoryID)
答案 0 :(得分:4)
您的item.Status字段是否包含O
或C
?如果是,那么这可能有效,将GET
方法更改为:
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";
var StatusOptions = new [] { new { Text = "Open", Value = "O" }, new { Text = "Closed", Value = "C" }};
ViewBag.CategoryID = new SelectList(StatusOptions, "Value", "Text", item.Status);
/* this line is duplicated
*/
// FollowUpItems followupitems = db.FollowUpItems.Find(id);
return View(item);
}
我不知道你的@Html.DropDownList("CategoryID")
有什么问题,你可能想把它改成:
@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)
我使用它,因为我发现它更具表现力 - 我可以清楚地看到我希望它绑定到哪个模型属性。
这可能会解决您的模型绑定问题。只需注意 - 在设置实体状态之前,必须先将其附加到数据库上下文,
db.Set<FollowUpItems>().Attach(followupitems);