【问题标题】:.NET MVC 3 Adding attributes to SelectListItem in C#.NET MVC 3 在 C# 中向 SelectListItem 添加属性
【发布时间】:2011-12-07 00:06:27
【问题描述】:

所以我试图在下拉列表中对标签进行样式化。我的 MVC 助手是这样设置的,但真实的东西是从数据库中提取的,所以数据不是硬编码的。

@{
    List<string> ListOfText = new List<string> { "FirstThing","SecondThing","ThirdThing"};
    List<string> ListOfValue = new List<string> { "1","2","3"};
    List<SelectListItems> ListOFSELCETLISTITEMS = new List<SelectListItem>();    

    for (int x = 0; x < 3; x++)
    {
        ListOFSELCETLISTITEMS .Add(new SelectListItem
        {
            Text = ListOfText[x],
            Value = ListOfValue[x],
            Selected = (selectedValue == ListOfValue[x])
        });
    }
}   
@Html.DropDown("NAME",ListOFSELCETLISTITEMS)

这给了我类似的东西

<select id="Name" name="Name">
    <option value="1">FirstThing</option>
    <option value="2">SecondThing</option>
    <option value="3">ThirdThing</option>
</select>

我需要的是这样的东西

<select id="Name" name="Name">
    <option value="1" class="option1">FirstThing</option>
    <option value="2" class="option2">SecondThing</option>
    <option value="3" class="option3">ThirdThing</option>
</select>

我试过做类似的事情

@{
    List<string> ListOfText = new List<string> { "FirstThing","SecondThing","ThirdThing"};
    List<string> ListOfValue = new List<string> { "1","2","3"};
}
<select id="Name" name="Name">
    @ for (int x = 0; x < 3; x++)
    {
        <text>
        <option value="@ListOfValue[x]" @{if(selectedValue == ListOfValue[x])
            { @Html.Raw("selected='selected'") }}
            @class = '@Html.Raw("option"+x)'>
            @ListOfText[x]
        </option>
        </text>
    }   
</select>

但这似乎让控制器感到困惑,并且它无法识别上面的下拉列表值映射到

public ActionResult method(string Name)

在控制器上发布或获取。好线

 @Html.DropDown("NAME",ListOFSELCETLISTITEMS)

在视图中确实允许控制器理解方法应该映射到该下拉列表的值。

我该怎么做?有没有办法解开控制器的困惑并能够在没有 Html.helpers 的情况下手写 HTML?

【问题讨论】:

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


【解决方案1】:

编辑:我之前的帖子链接到不正确的代码。

我建议您创建自己的 HTML Helper 扩展方法。这就是我过去的做法,遗憾的是我手头没有代码来展示示例。

你基本上需要创建一个方法来接受你的参数并返回一个 htmlstring

你最终会替换

@Html.DropDown("NAME",ListOFSELCETLISTITEMS)

类似的东西

@Html.MyDropDown("NAME",ListOFSELCETLISTITEMS)

在您循环列表并创建格式正确的 html 字符串以返回的位置,然后您可以添加任意数量的额外属性

【讨论】:

  • 好吧,这听起来不错。我需要从哪个类继承才能使其显示为 HTML 对象的一部分?您是否可以找到一个示例链接来给我一个起点?
  • 使用 Html.Raw() 发出一个普通字符串怎么样?
  • @Dan,这个似乎有足够的信息来做你需要的事情asp.net/mvc/tutorials/creating-custom-html-helpers-cs
【解决方案2】:

要直接渲染控制器动作,你可以试试:

@{ Html.RenderAction(Action, Controller); }

调用您的控制器操作,该操作应返回包含您的内容的字符串。

[HttpGet]
public string Action(int id) 
{
   return your context in here
}

但是我认为添加一个 Ajax 操作更简洁,该操作返回用于构建选择的数据并在获得结果后,使用 jquery 解决方案添加一个类(可以在 AJAX 响应本身中返回)

编辑:澄清:

假设你有如下的 Item 集合:

class Item {
   public int Value { get; set; }
   public string CssClass { get; set; }
   public string Description{ get; set; }
}
private const string EMPTY_OPTION = "<option value=''></option>";
[HttpGet]
public string Action(int id) 
{
    // Load a collection with all your option's related data
    IQueryable data = LoadSomethingFromDbOrWherever(id);
    // Build output
    StringBuilder sb = new StringBuilder();
    sb.AppendFormat("<select id='foo' name='foo'>");
    sb.AppendFormat(EMPTY_OPTION);
    foreach (Item b in data)
    {
            sb.AppendFormat("<option value='{0}' class='{1}'>{2}</option>",
                            b.Value, b.CssClass, b.Description);
    }
    sb.AppendFormat("</select>");
    return sb.ToString();
}

对于 ajax 选项:

[HttpGet]
public JsonResult Action(int id) 
{
   //same as above, obtain a collection
    // Load a collection with all your option's related data
    IQueryable data = LoadSomethingFromDbOrWherever(id);
    var jsonData = new
            {
                    from c in data
                    select new
                    {
                        Value= c.Value,
                        CssClass = c.CssClass,
                        Description = c.Desription
                    }).ToArray()
            };
    return Json(jsonData);
}

通过 $.ajax 调用它,在回调中您将拥有一个包含所有数据的 javascript 对象,然后使用 jQuery 构建选择选项。

问候

【讨论】:

  • 这看起来像是写我尝试的第二件事的一种方式,但在控制器中而不是在视图中,这是很高兴知道的。您能否在使用 jquery 的答案之后扩展添加一个类?我觉得这样可以把我拥有的东西变成我想要的东西。
  • 在这个例子中你如何传递 ID 参数?会不会像@{ Html.RenderAction(Action, Controller,new{params}); }
  • 通过 Html.RenderAction(Action, Controller,new{id = value});} 完成
【解决方案3】:

使用 jquery 你可以尝试这样的事情:

$('#Name option').each(function(){
    var i = $(this).attr('value');
    $(this).addClass('option'+i);
});

(我还是 jquery 的新手,但我试过了,它成功了)

【讨论】:

    猜你喜欢
    • 2016-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    相关资源
    最近更新 更多