2012-08-15 38 views
1

我使用这个代码来生成定制DropDownListFor添加属性自定义的HtmlHelper的元素

public static MvcHtmlString LookupFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression) 
{ 
    ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
    string lookup = metadata.PropertyName; 

    IEnumerable<lookup> list = Get(lookup); 
    IEnumerable<SelectListItem> items = list.Select(o => new SelectListItem 
       { 
        Text = o.title, 
        Value = o.id.ToString(), 
        Selected = o.id.Equals(metadata.Model) 
       }).ToList(); 

    string id = "_" + (new Random()).Next(10000); 
    MvcHtmlString dropDown = htmlHelper.DropDownListFor(expression, items, "---", new {title = lookup, id}); 
    return dropDown; 
} 

是它可以添加到HTML attribute一些options

回答

0

我找到解决方案,为此

public static HtmlString LookupFor<TModel, TEnum>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TEnum>> expression) 
     { 
      ModelMetadata metadata = ModelMetadata.FromLambdaExpression(expression, htmlHelper.ViewData); 
      string lookup = metadata.PropertyName; 

      IEnumerable<lookup> list = Get(lookup).ToList(); 
      IEnumerable<SelectListItem> items = list.Select(o => new SelectListItem 
      { 
       Text = o.title, 
       Value = o.id.ToString(), 
       Selected = o.id.Equals(metadata.Model) 
      }).ToList(); 

      string id = "_" + (new Random()).Next(10000); 
      MvcHtmlString dropDown = htmlHelper.DropDownListFor(expression, items, "---", new { title = lookup, id }); 

      var xml = XDocument.Parse(dropDown.ToHtmlString()); 
      var xml_select = xml.Element("select"); 
      if (xml_select != null) 
      { 
       var options = xml_select.Elements("option"); 
       foreach(var c in options) 
       { 
        var val_attribute = c.Attribute("value"); 
        if (val_attribute != null) 
        { 
         string value = val_attribute.Value; 
         int tmp; 
         if (Int32.TryParse(value,out tmp)) 
         { 
          var fd = list.FirstOrDefault(o => o.id == Convert.ToInt32(value)); 
          if (fd == null) continue; 
          if (!fd.active) 
          { 
           c.SetAttributeValue("class", "deactive-lookup"); 
          } 
         } 
        } 
       } 
      } 
      string html_string; 
      using (var stringWriter = new StringWriter()) 
      { 
       using (var xmlTextWriter = XmlWriter.Create(stringWriter)) 
       { 
        xml.WriteTo(xmlTextWriter); 
        xmlTextWriter.Flush(); 
        html_string = stringWriter.GetStringBuilder().ToString(); 
       } 
      } 
      return new HtmlString(html_string); 
     } 
2

您需要@前缀class,因为类是在C#中的关键字:

MvcHtmlString dropDown = htmlHelper.DropDownListFor(expression, items, "---", new { @class = "cssClass", title = lookup, id}); 
+0

@Thank你西门,你正确的,但我的问题是关于访问此代码中的'option'元素。 – Mironline 2012-08-16 05:40:31