2013-05-07 3 views
5

Seçili liste seçeneğinin Option etiketinde özel öznitelikleri kabul etmek için açılır liste için özel bir htmlhelper (Uzantı Yöntemi) oluşturmak istiyorum.MVC içinde SelectlistItem için Özel Öznitelikler

Model sınıfımda, seçim listesinin seçenek etiketinde bir öznitelik olarak yer almak istediğim bir özelliğim var.

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

ben isterdi oldukça spesifik çeşitli örnekler ama olmayan karşılaştık.

cevap

4

bu deneyin:

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

Evet, bunu kendi başınıza oluşturabilirsiniz. Gerekli tüm özellikleri içeren bir Nesne listesi kabul edecek bir Uzantı yöntemi oluşturun. Etiket oluşturmak için TagBuilder'ı kullanın ve kendi özelliğinizi eklemek için MergeAttribute yöntemini kullanın. Şerefe