【问题标题】:mvc3 Html.DropDownListFor - dynamically create "value" attribute in <option>mvc3 Html.DropDownListFor - 在 <option> 中动态创建“值”属性
【发布时间】:2014-06-21 03:19:41
【问题描述】:

我正在尝试使用 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

谢谢!

【问题讨论】:

    标签: c# html asp.net-mvc asp.net-mvc-3


    【解决方案1】:

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

    @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>
    

    【讨论】:

    • 我仍然得到没有“ ???
    • 更新了我的答案,以便更好地向您展示它是如何工作的。希望对您有所帮助。
    【解决方案2】:

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

    这是我的代码:

    @Html.DropDownList("ResidentialBuilding", new SelectList(Model.Select(x => x.type).Distinct()))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 1970-01-01
      • 2020-01-08
      • 1970-01-01
      • 1970-01-01
      • 2022-06-24
      相关资源
      最近更新 更多