2010-07-28 9 views
17

J'essaie d'écrire ma propre petite aide HTML qui agit beaucoup comme DropDownListFor mais qui ne souffre pas du même problems que j'ai déjà rencontré. Ne discutons pas si oui ou non DropDownListFor est erroné — ce n'est pas ce que cette question traite.ASP.NET MVC: Pourquoi `ToMvcHtmlString` n'est-il pas public?

De toute façon, quelle est la raison pour laquelle les gars MVC font ToMvcHtmlString interne et non public?

Répondre

8

Je suppose que c'est pour vous encourager à utiliser System.Web.HtmlString à la place. Mais oui, je me suis demandé cela moi-même et j'ai écrit une extension ToMvcHtmlString en double dans mes propres aides. MvcHtmlString est, IIRC, juste leur correctif de compatibilité ainsi MVC 2 peut fonctionner sur .NET 3.5 et 4 - mais même alors il serait utile d'utiliser dans votre propre code pour cela.

5

Est-ce que cela résout votre problème?

public static MvcHtmlString SuperDenizControl(this HtmlHelper html) 
{ 
    var builder = new TagBuilder("select"); 
    //blah blah blah amazing control 
    var control = builder.ToString(); 
    return MvcHtmlString.Create(control); 
} 
+0

Ce n'est pas un problème, je suis juste curieux de savoir pourquoi. Nom de la méthode cool, d'ailleurs! :) –

23

Je pensais que je posterais une solution de contournement facile pour ceux qui pourraient en chercher un et trébucher sur cette question.

Alors que ToMvcHtmlString est interne, il est assez facile de contourner car il utilise les méthodes publiques:

De la source MVC:

internal MvcHtmlString ToMvcHtmlString(TagRenderMode renderMode) { 
    return MvcHtmlString.Create(ToString(renderMode)); 
} 

Les deux MvcHtmlString.Create et TagBuilder.ToString sont si publics il suffit de remplacer

return tagBuilder.ToMvcHtmlString(TagRenderMode.Normal); 

avec

return MvcHtmlString.Create(tagBuilder.ToString(TagRenderMode.Normal)); 

et vous êtes prêt à partir! Fonctionne très bien pour moi. Je ne sais pas pourquoi ils ont même pris la peine de faire une méthode interne séparée.