0

我正在尝试使用 HTML.DropDownListFor 动态生成标记的“值”属性,但我遇到了问题。我正在考虑硬编码一个for循环并插入原始HTML,但我很肯定有一种更简单的方法来做到这一点(?)

我有一个视图模型:

    public class DSDCustomerViewModel
        {
            public IEnumerable<dsd_l_chain> chainBuild { get; set; }
            public string Id_dsd { get; set; }
            public string Owner { get; set; }
            public IEnumerable<string> WFCategory { get; set; }
            public IEnumerable<string> TransactionType { get; set; } 
[etc etc etc]

chainBuild 属性来自我的数据库(使用 EF),我使用扩展方法为我的视图填充,如下所示:

@using (Html.BeginForm())
{
    @Html.ValidationSummary(true)
    <table>
        <tbody>
[etc etc]
<td colspan="1" rowspan="1">
                    Chain Name
                </td>
                <td colspan="1" style="vertical-align: top;">
                    @Html.DropDownListFor(model => model.cc_chainName, new SelectList(Model.cc_chainName), "Select ...")
                </td>
                <td rowspan="1" colspan="2" style="vertical-align: top;">
                    @Html.ValidationMessageFor(model => model.cc_chainName)
                </td>
[etc etc]

cc_chainName EF 对象具有“Chain_Desc”、“Chain”、“Chain_Group”和“ID”等属性。

生成的 HTML 如下:

<select id="cc_chainName" name="cc_chainName"><option value="">Select ...</option>
<option>1ST STOP</option>
<option>3 RIVERS ICE CREAM SPCLTS</option>
<option>3RIVERS SALES TO NON-NAP CUSTS</option>

如何修改:

@Html.DropDownListFor(model => model.cc_chainName, new SelectList(Model.cc_chainName), "Select ...")

...以便生成的 HTML 代码将标记的“值”属性设置为 cc_chainName.ID?这样生成的 HTML 将如下所示:

<select id="cc_chainName" name="cc_chainName"><option value="">Select ...</option>
<option value="1">1ST STOP</option>
<option value="2">3 RIVERS ICE CREAM SPCLTS</option>
<option value="3">3RIVERS SALES TO NON-NAP CUSTS</option>

注意“值”标签包含来自 cc_chainName 模型的 ID

谢谢!

4

2 回答 2

3

每个在构造函数中都有SelectList一个dataValueFieldanddataTextField属性:

@Html.DropDownListFor(model => model.cc_chainName, 
                     new SelectList(Model.cc_chainName, 
                                    "ID", "TextualPropertyNameHere"), "Select ...")
                            //      ^^ id property and text property here

您没有提供文本属性名称.. 所以上面假设一个类似于这样的模型:

class cc_chainName {
    public int ID { get; set; }
    public string TextualPropertyNameHere { get; set; }
}

编辑:

回应您的评论。

考虑这个模型:

public class Product {
    public int Id { get; set; }
    public string ProductName { get; set; }
}

将其设置为视图中的可枚举:

@model IEnumerable<YourApplication.Models.Product>

..使用此控制器操作:

var products = new List<Product>()
{
    new Product() { Id = 1, ProductName = "Lollies" },
    new Product() { Id = 2, ProductName = "Beer" },
    new Product() { Id = 3, ProductName = "Funny Hat" }
};

return View(products);

DropDownList(注意属性名称是字符串SelectList):

@Html.DropDownList("myDropDown", new SelectList(Model, "Id", "ProductName"), "-- Select item --")

生成以下标记:

<select id="myDropDown" name="myDropDown">
    <option value="">-- Select item --</option>
    <option value="1">Lollies</option>
    <option value="2">Beer</option>
    <option value="3">Funny Hat</option>
</select>

要获得您想要的,您可以在两个字符串中显式传递“ProductName”.. 像这样:

@Html.DropDownList("myDropDown", new SelectList(Model, "ProductName", "ProductName"), "-- Select item --")

产生:

<select id="myDropDown" name="myDropDown">
    <option value="">-- Select item --</option>
    <option value="Lollies">Lollies</option>
    <option value="Beer">Beer</option>
    <option value="Funny Hat">Funny Hat</option>
</select>
于 2013-09-05T00:07:19.067 回答
0

如何考虑不同的选项元素?我有一个 DropDownList ,其中包含来自数据库的一些重复元素。我似乎只能获得价值属性或不同的元素。

这是我的代码:

@Html.DropDownList("ResidentialBuilding", new SelectList(Model.Select(x => x.type).Distinct()))
于 2014-06-20T19:19:41.260 回答