1

我正在尝试为下拉列表设置选定的值。

在控制器中我有

ViewData["productType"] = new SelectList(myDropDownList);

在视图中:

<%= Html.DropDownList("productType", ViewData["productType"] as SelectList, "defaultValue")%>

到目前为止很好,但问题是现在我的下拉列表中有两次“defaultValue”。所以我在下拉列表中有我的所有值,包括“defaultValue”。但此代码将添加“defaultValue”作为第一个元素。我看到了它的两个样本。

我喜欢将所选值设置为“defaultValue”而不添加两次。

我试过

ViewData["productType"] = new SelectList(myDropDownList, "defaultValue" );

但它没有用。

谁能告诉我该怎么做?

4

1 回答 1

5

您不应该使用与下拉列表的第一个参数相同的名称作为第二个参数。在您的示例中,您已用于productType存储所选值和可用值列表。为了在 ASP.NET MVC 中呈现 DropDown,您需要 2 个属性:

<%= Html.DropDownList(
    "selectedProductType", 
    ViewData["productType"] as SelectList, 
    "defaultValue"
) %>

在您的控制器操作中,您可以设置这两个属性:

ViewData["selectedProductType"] = "abc";
ViewData["productType"] = new SelectList(myDropDownList);

这假设您value="abc"的产品类型下拉列表中已经有一个元素。然后将自动预选该值。

我会向您推荐一种替代方法来呈现下拉列表。它包括摆脱视图数据和引入视图模型以及使用强类型版本的助手:

public class ProductViewModel
{
    public string SelectedProductType { get; set; }
    public IEnumerable<SelectListItem> ProductTypes { get; set; }
}

然后您将拥有一个控制器操作,它将填充此视图模型并将其传递给视图:

public ActionResult SomeAction()
{
    var model = new ProductViewModel();

    // preselected an element with value = "type2"
    model.SelectedProductType = "type2";

    // bind the available product types
    model.ProductTypes = new SelectList(
        // Obviously those could come from a database or something
        new[] {
            new { Value = "type1", Text = "product type 1" },
            new { Value = "type2", Text = "product type 2" },
            new { Value = "type3", Text = "product type 3" },
            new { Value = "type4", Text = "product type 4" },
        }, 
        "Value", 
        "Text"
    );

    // pass the view model to the view
    return View(model);
}

最后在您的强类型视图中:

<%= Html.DropDownListFor(
    x => x.SelectedProductType, 
    Model.ProductTypes, 
    "defaultValue"
) %>
于 2012-10-09T06:07:08.413 回答