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属性始终为空。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)
4

1 回答 1

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);
于 2013-01-24T17:51:46.547 回答