2009-09-13 8 views
0

Je souhaite utiliser la classe ViewPage/HtmlHelper dans l'espace de noms System.Web.Mvc dans un projet distinct. J'ai importé les bibliothèques pertinentes puis essayé ceci:Réutilisation de ViewPage/HtmlHelper dans un projet séparé dans ASP.NET MVC à l'aide de C#

using System.Web.Mvc; 
using System.Web.Mvc.Resources; 
using System.Web.Mvc.Html; 

public static class Display 
{ 
    public static string CheckBox() 
    { 
     ViewPage viewPage = new ViewPage(); 
     return viewPage.Html.CheckBox("Test"); 
    } 
} 

que j'appelle comme ça dans une autre classe qui comprend ma classe d'affichage:

string Checkbox = Display.CheckBox(): 

Cette compile très bien, mais quand je le lance, je reçois :

System.NullReferenceException: objet référence non définie à une instance d'un objet .

Je veux simplement utiliser les méthodes d'extension de HtmlHelper tel qu'il est, par exemple: page.Html.ActionLink(), page.Html.Radionbutton(), etc. Comment puis-je résoudre ce problème?

Répondre

0

Les aides HTML requièrent que la propriété ViewContext de ViewPage soit définie. En règle générale, ce n'est pas le cas dans un contrôleur ou un autre code de classe.

Pourriez-vous empaqueter ce CheckBox dans un fichier ASCX et y faire référence par d'autres vues avec un appel de méthode Html.RenderPartial?

+0

Je ne comprends pas votre question, qu'est-ce que tu veux dire? –

+0

@Mr. Smith: On dirait que vous voulez partager une chose visuelle (une case à cocher) avec d'autres parties d'un site Web MVC. Ce concept n'a pas à exister dans une classe C# spécifique, et peut être mieux exprimé en plaçant cette case à cocher dans sa propre vue partielle partagée. Il peut encore être exploité par d'autres vues/contrôleurs et, mieux encore, vous aurez un accès direct aux méthodes d'assistance Html dans la vue partielle. –

+0

Je suis parti avec l'utilisation de la classe TagBuilder à la place. J'écris une classe qui génère des balises d'entrée à la volée basé sur les colonnes dans un DataTable ou les propriétés d'une classe –

1

Etes-vous en train d'essayer d'appeler votre CheckBox() personnalisé à partir d'un endroit différent de la vue? S'il vous plaît ne faites pas ça. La philosophie derrière ASP.NET MVC est que votre contrôleur doit préparer toutes les données pour la vue, puis la vue doit décider comment le rendre.

Si vous redessinez votre méthode pour être une méthode d'extension, vous pouvez le faire:

public static class Display // class name really don't matter for extension methods 
{ 
    public static string CheckBox(this HtmlHelper html) 
    { 
     return html.CheckBox("Test"); 
    } 
} 

Dans la vue:

<%= Html.CheckBox() %> 

Notez que cela peut provoquer un conflit de noms avec des méthodes d'extension existantes . Une façon d'éviter que est de concevoir quelque chose comme:

Nouveau code en vue:

<%= Html.Display().CheckBox() %> 

Nouveau code d'extension:

public static DisplayExtension 
{ 
    public static Display(this HtmlHelper html) 
    { 
     return new Display(html); 
    } 
} 


public class Display // no longer static 
{ 
    private readonly HtmlHelper html; 

    public string Display(HtmlHelper html) 
    { 
     this.html = html; 
    } 

    public string CheckBox() 
    { 
     return html.CheckBox("Test"); 
    } 
}