【问题标题】:SelectList selected value not carried over to DropDownListSelectList 选择的值未结转到 DropDownList
【发布时间】:2012-03-05 08:34:57
【问题描述】:

我有一个 Razor 页面,表单中有一个下拉列表:

@using (Html.BeginForm("ProductsByOwners", "Report", FormMethod.Post, new { @id = "ProductsByOwners" }))
{            
    @Html.Label("Choose product owner: ")
    @Html.DropDownList("OwnerList", (SelectList)ViewBag.OwnerList, new { @onchange = "this.form.submit();" })    
}

我的SelectList 的选定值没有被转移到DropDownList。我已经调试并单步执行了代码,发现 (SelectList)ViewBag.OwnerList 可以正确评估并选择了预期值,但生成的 HTML 没有选择任何 option 标记。

谁能看到我在这里做错了什么?

更新

这是在我的操作中创建 SelectList 的方式:

ViewBag.OwnerList = new SelectList(ListUtils.ProductOwners(), "Key", "Value", values["OwnerList"]);

结果具有选定的values["OwnerList"] 指示的值。

谢谢!

【问题讨论】:

  • 您能否展示一下您创建选择列表的位置?
  • 我添加了一个更新。虽然,我很确定问题出在视图中。我已经将代码一路单步执行到视图中,并且 SelectList 有一个选定的值。
  • 您确定指定的值 (values["OwnerList"]) 存在于 ProductOwners-list 中吗?选择列表中的值是否正确呈现?
  • 是的。当我向ViewBag.OwnerList 添加手表时,SelectedValue 属性与values["OwnerList"] 相同,当我深入到SelectListItem 时,Selected 属性为true
  • 'Key'是什么类型的?您是否尝试将 values["OwnerList"] 转换为该特定类型?

标签: asp.net-mvc razor


【解决方案1】:

您没有正确使用 DropDownList 助手。为了创建一个下拉列表,您需要两件事:

  1. 提交表单时绑定到选定值的标量属性
  2. 将选项绑定到的集合

在您的示例中,您只有其中两件事之一(第二件事)。您的第一个参数称为OwnerList,您将ViewBag.OwnerList 作为第二个参数传递。

所以:

@Html.DropDownList(
    "SelectedOwnerId", 
    (SelectList)ViewBag.OwnerList, 
    new { @onchange = "this.form.submit();" }
)

显然,我建议您使用强类型视图和视图模型。并且显然摆脱了弱类型的 ViewBag/ViewData/ViewCrap。

因此,首先设计一个视图模型来满足您的视图要求(从您目前所展示的内容来看,它是显示一个下拉列表):

public class OwnerViewModel
{
    [DisplayName("Choose product owner: ")]
    public string SelectedOwnerId { get; set; }

    public IEnumerable<SelectListItem> OwnerList { get; set; }
}

然后是控制器:

public class ReportController: Controller
{
    public ActionResult ProductsByOwners()
    {
        var model = new OwnerViewModel
        {
            // preselect the second owner
            SelectedOwnerId = "2",

            // obviously those come from your database or something
            OwnerList = new[] 
            {
                new SelectListItem { Value = "1", Text = "owner 1" },
                new SelectListItem { Value = "2", Text = "owner 2" },
                new SelectListItem { Value = "3", Text = "owner 3" },
            }
        };
        return View(model);
    }

    [HttpPost]
    public ActionResult ProductsByOwners(OwnerViewModel model)
    {
        ...
    }
}

你有一个对应的强类型视图:

@model OwnerViewModel
@using (Html.BeginForm("ProductsByOwners", "Report", FormMethod.Post, new { id = "ProductsByOwners" }))
{            
    @Html.LabelFor(x => x.SelectedOwnerId)
    @Html.DropDownListFor(
        x => x.SelectedOwnerId, 
        Model.OwnerList, 
        new { onchange = "this.form.submit();" }
    )
}

【讨论】:

    【解决方案2】:

    在 DDL 中未选择所选项目的最常见原因是您将选择列表命名为与模型相同。 强类型视图是首选,但在 Viewbag 中传递 SelectList 是很好。请参阅我的教程Working with the DropDownList Box and jQuery 和我的博客Cascading DropDownList in ASP.Net MVC

    【讨论】:

    • 为什么这很重要?这很奇怪,但在我的情况下是原因。
    • 这是为我做的。默认的控件脚手架以属性命名集合,但在极有可能的情况下,您需要做的不仅仅是模板所做的任何事情,它就会死掉。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多