【问题标题】:use Html.DropDownListFor() w/o using Model使用 Html.DropDownListFor() 不使用模型
【发布时间】:2011-12-05 17:11:27
【问题描述】:

我正在将一个模型传递到我的视图 (.net mvc 3) 中,它不能包含我想用来填充我的下拉列表的信息。

我从未使用过 Html.DropDownListFor(),但一直只使用 Html.DropDownList()。不过,我想在我的技巧包中添加另一个工具,因此想尝试合并 Html.DropDownListFor()。

是否可以将此帮助程序与在 ViewBag 变量中设置的键/值对一起使用?

请告知,任何代码示例都将不胜感激(前端(剃须刀)和后端(在控制器上))。

TIA

【问题讨论】:

  • 您是否为要用于填充下拉列表的数据类型定义了自定义显示(editorfor 等)?
  • 甚至不确定那是什么......所以不,我没有:/
  • 我很困惑 - 为什么不能将构建下拉列表所需的信息作为模型的一部分传递到视图中?如果您没有构建它的信息,editorfor/dropdownfor 等根本不会帮助您

标签: asp.net-mvc razor html.dropdownlistfor


【解决方案1】:

是否可以将此帮助程序与在 ViewBag 变量中设置的键/值对一起使用?

绝对不是。如果你想使用 Html.DropDownListFor 之类的强类型助手,你需要一个视图模型。由于我总是推荐使用视图模型,这里有一个例子:

public class MyViewModel
{
    public string SelectedId { get; set; }
    public IEnumerable<SelectListItem> Items { get; set; }
}

正如您在此示例视图模型中看到的,对于每个下拉列表,您需要 2 个属性:一个将保存所选值的标量属性和一个 SelectListItem 的集合,它将保存每个选项由一个值组成的选项和文本。

那么控制器的职责就是初始化这个视图模型并将其传递给视图:

public ActionResult Index()
{
    var model = new MyViewModel();
    // normally those values will be dynamic. They will be mapped 
    // to the view model
    model.Items = new[]
    {
        new SelectListItem { Value = "1", Text = "item 1" },
        new SelectListItem { Value = "2", Text = "item 2" },
        new SelectListItem { Value = "3", Text = "item 3" },
    };
    return View(model);
}

然后您将拥有与此视图模型相对应的强类型视图,您将能够在其中使用强类型版本的助手:

@model MyViewModel
@Html.DropDownListFor(x => x.SelectedId, Model.Items)

您问题中的以下句子值得关注:

我将一个不能包含 我想用来填充下拉列表的信息。

您不应该将模型传递给视图。您应该传递一个视图模型。视图模型是您专门为每个视图定义的类。它将包含此视图所需的必要信息。因此,一个视图模型可以由多个模型组成,因为这就是您的视图的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多