2013-05-07 16 views
5

Chciałbym utworzyć niestandardową htmlhelper (metoda rozszerzenia) dla dropdownlist, aby zaakceptować niestandardowe atrybuty w znaczniku Option z selectlistitem.Niestandardowe atrybuty dla SelectlistItem w MVC

Posiadam właściwość w klasie modelu, którą chciałbym dołączyć jako atrybut w znaczniku opcji na liście wyboru.

tj <option value ="" modelproperty =""></option>

mam natknąć różnych przykładów, ale nie dość specyficzne, co bym chciał.

Odpowiedz

4

Spróbuj tego:

public static MvcHtmlString CustomDropdown<TModel, TProperty>(
    this HtmlHelper<TModel> htmlHelper, 
    Expression<Func<TModel, TProperty>> expression, 
    IEnumerable<SelectListItem> listOfValues, 
    string classPropName) 
{ 
    var model = htmlHelper.ViewData.Model; 
    var metaData = ModelMetadata 
     .FromLambdaExpression(expression, htmlHelper.ViewData);    
    var tb = new TagBuilder("select"); 

    if (listOfValues != null) 
    { 
     tb.MergeAttribute("id", metaData.PropertyName);     

     var prop = model 
      .GetType() 
      .GetProperties() 
      .FirstOrDefault(x => x.Name == classPropName); 

     foreach (var item in listOfValues) 
     { 
      var option = new TagBuilder("option"); 
      option.MergeAttribute("value", item.Value); 
      option.InnerHtml = item.Text; 
      if (prop != null) 
      { 
       // if the prop's value cannot be converted to string 
       // then this will throw a run-time exception 
       // so you better handle this, put inside a try-catch 
       option.MergeAttribute(classPropName, 
        (string)prop.GetValue(model));  
      } 
      tb.InnerHtml += option.ToString(); 
     } 
    } 

    return MvcHtmlString.Create(tb.ToString()); 
} 
0

Tak, możesz go utworzyć samodzielnie. Utwórz jedną metodę rozszerzenia, która będzie akceptować listę obiektów, która zawiera wszystkie wymagane właściwości tego obiektu. Użyj TagBuilder do tworzenia tagów i użyj metody MergeAttribute, aby dodać do niego swój własny atrybut. Cheers

Powiązane problemy