C# .NET MVC 3在C中向SelectListItem添加属性

C# .NET MVC 3在C中向SelectListItem添加属性,c#,.net,html,asp.net-mvc-3,C#,.net,Html,Asp.net Mvc 3,所以我尝试在下拉列表中设置标签的样式。我的MVC助手是这样设置的,但是真正的东西是从数据库中提取的,所以数据不是硬编码的 @{ List<string> ListOfText = new List<string> { "FirstThing","SecondThing","ThirdThing"}; List<string> ListOfValue = new List<string> { "1","2","3"}; Lis

所以我尝试在下拉列表中设置标签的样式。我的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)
在控制器中的post或get上。好的,那条线

 @Html.DropDown("NAME",ListOFSELCETLISTITEMS)
在视图中,确实允许控制器理解方法应该映射到该下拉列表的值


我该怎么做?有没有办法取消对控制器的使用,并且能够在没有HTML.helpers的情况下手工编写HTML?

编辑:我以前的帖子链接到了错误的代码

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

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

你最终会取代

@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>
@Html.MyDropDown("NAME",ListOFSELCETLISTITEMS)

如果要循环列表并创建格式正确的html字符串以返回,则可以添加所需的额外属性,以直接呈现控制器动作,可以尝试:

@{Html.renderAction,控制器;}

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

[HttpGet]
public string Action(int id) 
{
   return your context in here
}
但是,我认为添加Ajax操作更为简洁,该操作返回用于构建select的数据,并在获得结果后,使用jquery解决方案添加一个可以在Ajax响应本身中返回的类

编辑:澄清:

假设您有一个项目集合,如下所示:

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调用它,在回调中您将有一个包含所有数据的javascript对象,然后使用jQuery构建select选项


关于

使用jquery,您可以尝试以下方法:

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

我仍然是jquery的新手,但我尝试了这个,它起了作用

这看起来像是在控制器中编写第二件事,而不是在视图中编写,这很好。你能用jquery解释一下在事实发生后添加一个类吗?我觉得这会把我拥有的东西变成我想要的东西。在这个例子中,如何传递ID参数?它是否类似于@{Html.renderAction,Controller,new{params};}通过Html.renderAction,Controller,new{id=value};}完成@e-MEE你能用Jquery提交一个答案,告诉我你在说什么吗?好的,听起来不错。我需要从哪个类继承以使其显示为HTML对象的一部分?你能找到一个示例链接给我一个起点吗?使用Html.Raw来发出一个普通字符串怎么样?@Dan,这一个似乎有足够的信息来做你需要的事情
[HttpGet]
public string Action(int id) 
{
   return your context in here
}
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();
}
[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);
}
$('#Name option').each(function(){
    var i = $(this).attr('value');
    $(this).addClass('option'+i);
});