2013-11-19 3 views
5

Я использую MVC 5, и я пытаюсь написать некоторые методы расширения Bootstrap. Моя цель - «перезаписать» метод Html.ActionLink с помощью Html.BootstrapLinkButton. Метод BootstrapLinkButton должен сгенерировать ссылку на классы css "btn btn-default" автоматически. Мой код до сих пор:HtmlAttributes in Extension Method

public static MvcHtmlString BootstrapLinkButton(this HtmlHelper htmlHelper, 
    string linkText,string actionName, string controllerName, 
    object routeValues = null, object htmlAttributes = null) 
    { 
     var attributes = 
      HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 

     if (attributes.ContainsKey("class")) 
     { 
      object value; 
      attributes.TryGetValue("class", out value); 
      value = (value as string) + " btn btn-default"; 
      attributes["class"] = value; 
     } 
     else 
     { 
      attributes["class"] = "btn btn-default"; 
     } 

     return htmlHelper.ActionLink(
      linkText, actionName, controllerName, routeValues, 
      new Dictionary<string, object>(attributes)); 
    } 

, который дает мне следующий результат в HTML:

<a comparer="System.Collections.Generic.GenericEqualityComparer`1[System.String]" 
    count="3" 
    keys="System.Collections.Generic.Dictionary`2 
     +KeyCollection[System.String,System.Object]"  
    values="System.Collections.Generic.Dictionary`2 
      +ValueCollection[System.String,System.Object]" 
    href="/test/test/"> 
    Test 
</a> 

Я искал в Интернете, но ничего, кажется, решить эту проблему. Кто-нибудь знает волшебный код, чтобы исправить это?

ответ

2

Если мое решение может помочь любому, вот оно:

public static MvcHtmlString BootstrapLinkButton(this HtmlHelper htmlHelper, 
     string linkText, 
     string actionName, 
     string controllerName = null, 
     object routeValues = null, 
     object htmlAttributes = null, 
     string btnStyle = "default") 
    { 
     var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes); 
     controllerName = 
      controllerName ?? 
      HttpContext.Current.Request.RequestContext.RouteData.Values["controller"].ToString(); 

     if (attributes.ContainsKey("class")) 
     { 
      object value; 
      attributes.TryGetValue("class", out value); 
      value = string.Format("{0} btn btn-{1}", (value as string), btnStyle); 
      attributes["class"] = value; 
     } 
     else 
     { 
      attributes["class"] = string.Format("btn btn-{0}", btnStyle); 
     } 

     return htmlHelper.ActionLink(
      linkText, 
      actionName, 
      controllerName, 
      new RouteValueDictionary(routeValues), 
      new Dictionary<string, object>(attributes)); 
    } 
} 
+1

nit: вместо вызова 'HtmlHelper.AnonymousObjectToHtmlAttributes (routeValues)', используйте конструктор 'new RouteValueDictionary (routeValues)'. Вспомогательный метод по существу является оберткой этого и существует только во избежание путаницы в отношении именования. – bhamlin

+0

Спасибо за подсказку. Я изменил его в айнсере. – Thijs

1

Это уже реализовано в TwitterBootstrapMVC

Вот некоторые relevant code

Скорее всего причина ваш код не удается, потому что htmlHelper.ActionLink(...) метод есть запутался, о котором перегрузка должна быть использована. На нем нет перегрузки, которая принимает string, string, object, Dictionary, и это то, что вы пытаетесь передать ей.

+0

Спасибо за ссылку, я не знал об этом! Тем не менее, я хотел бы реализовать его сам, потому что на данный момент для BS3 требуется лицензия. – Thijs

+0

Это прекрасно. Не стесняйтесь просматривать/использовать код из github (связанный выше). – Dmitry

+0

Обновленный ответ для подсказки возможной проблемы с вашим кодом. – Dmitry