【问题标题】:ASP MVC3 get and set drop down list itemsASP MVC3 获取和设置下拉列表项
【发布时间】:2026-01-09 14:10:02
【问题描述】:

我正在尝试仅使用两个可选项目填充 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 按钮时,传递到控制器这一部分的FollowUpItemStatus 属性始终为空。

    [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);
    }

编辑

感谢 Quinton 在下面的回答,GET 问题已得到解决,但我仍然在设置值时遇到问题。使用@Html.DropDownList("CategoryID") 方法每次都会向控制器返回一个null 值(对于Status 值,所有其他值都是应有的),使用@Html.DropDownListFor(m =&gt; m.Status, ViewBag.CategoryID) 语法会导致以下错误消息:

“编译器错误消息:CS1973:“System.Web.Mvc.HtmlHelper”没有名为“DropDownListFor”的适用方法,但似乎具有该名称的扩展方法。扩展方法不能动态调度。考虑强制转换动态参数或在没有扩展方法语法的情况下调用扩展方法。'

最终编辑

我的视图中的以下演员允许我正确设置值

@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)

【问题讨论】:

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


    【解决方案1】:

    您的 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);
    

    【讨论】:

    • 这解决了 GET 问题,但它仍然显示我在尝试设置时传递了一个空值。
    • 使用 @Html.DropdownListFor() 返回此错误(页面不会加载):CS1973: 'System.Web.Mvc.HtmlHelper' has no applicable method named 'DropDownListFor' 但似乎具有该名称的扩展方法。
    • 如果可以的话,您应该更正您的答案以包括 '@Html.DropDownListFor(m => m.Status, (SelectList)ViewBag.CategoryID)' - 需要 (SelectList) 强制转换工作,工作完美,谢谢!
    最近更新 更多