ASP MVC3获取并设置下拉列表项

时间:2013-01-24 17:14:03

标签: asp.net-mvc asp.net-mvc-3

我正在尝试使用两个可选项填充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)

1 个答案:

答案 0 :(得分:4)

您的item.Status字段是否包含OC?如果是,那么这可能有效,将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);