【问题标题】:Html.DropDownListFor binding problemHtml.DropDownListFor绑定问题
【发布时间】:2011-05-11 11:29:43
【问题描述】:

所以我有这两张表 - products, measure_unit

Products: (id int, name varchar(20) , id_um INT ) 其中 id_um 是对 measurement_unit 表的主键的引用,id 是该表的主键。

Measurement_unit:(id_um int,名称 varchar(20))。 id_um 是主键 我使用 LINQ to SQL 映射了这两者。

当我想创建一个新产品时,我需要从一个单位测量列表中进行选择,这意味着一个带有其名称的下拉列表,但我想绑定所选产品的 id....

我在控制器中为 Create 操作执行此操作(创建新产品):

var items = new List<SelectListItem>();
            foreach (var t in db.measurement_unit)
                items.Add(new SelectListItem() { Text = t.name.ToString(), Value =t.id_um.ToString() });
ViewData["UM"] = new SelectList(items, "Value", "Text");

现在,对于视图:

<%: Html.DropDownListFor(model=>model.id_um,  (IEnumerable <SelectListItem>)ViewData["UM"])%>

但我收到以下错误:

The ViewData item that has the key 'id_um' is of type 'System.Int32' but must be of type 'IEnumerable<SelectListItem>'.

我之前在这件事上苦苦挣扎,之前我成功地让它工作了,但我不小心删除了那个项目。 请告诉我我做错了什么?谢谢!

【问题讨论】:

    标签: c# asp.net asp.net-mvc-2 data-binding


    【解决方案1】:

    我建议您使用视图模型而不是 ViewData。它将使代码更清洁/更安全/重构更友好/启用智能感知/更容易进行单元测试/魔术字符串免费/....:

    public class MyViewModel
    {
        public int Id { get; set; }
        public IEnumerable<SelectListItem> Items { get; set; }
    }
    

    控制器:

    public class HomeController: Controller
    {
        public ActionResult Index() 
        {
            var model = new MyViewModel
            {
                Items = db.measurement_unit.Select(x => new SelectListItem
                {
                    Value = x.id_um.ToString(),
                    Text = x.name.ToString()
                })
            };
            return View(model);
        }
    }
    

    最后在强类型视图中:

    <%= Html.DropDownListFor(
        x => x.Id,
        new SelectList(Model.Items, "Value", "Text")
    ) %>
    

    【讨论】:

    • 谢谢。我现在使用视图模型而不是 ViewData,它更容易、更快捷......
    猜你喜欢
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多