2010-08-01 10 views
2

HtmlHelpers sont vraiment utiles, aussi j'utilisais AjaxHelpers jusqu'à ce que je voulais faire quelque chose qu'ils ne peuvent pas ... alors maintenant je préfère jquery + javascript, mais je n'aime pas écrire en javascript (peut-être parce que je ne le connais jamais aussi bien que je voulais) et pour rendre la vie plus facile je voulais mettre en œuvre quelque chose comme JQueryHelper, mais je ne sais pas comment ça fonctionne. URL résolues, car la plupart des méthodes ne feraient que transmettre des données aux contrôleurs etc ... et mettre à jour certaines parties de l'interface utilisateur, donc je voudrais créer quelque chose comme AjaxHelper, mais basé sur JQuery, pas sur MSScripts.Comment mettre en œuvre like-HtmlHelper

Que devrais-je inclure dans une telle classe? comment puis-je obtenir le contexte, url et générer le code javascript approprié qui peut être dynamiquement injecté dans ex.

<div onclick=JQuery.Action("<ActionName>", "<Controller>", new { param1, param2}, <Id to Update>)> My Div</div> 

Comment est-il implémenté dans HtmlHelper ou AjaxHelper?

Editer: J'ai essayé quelques implémentations simples, mais je pense que je suis un manque de connaissances et je ne sais pas comment implémenter une classe avec des extensions exacly.

J'ai ClassA (classe) et ClassAExt (extensions): J'ai quelque chose comme ça:

static public class ClassAExt{ 
    public static MvcHtmlString Method(this ClassA classA) { 

    } 
} 

Mais dans la vue(), lorsque j'utilise ClassAExt.Method() j'ai passer aussi instance de ClassA (dans les helpers Ajax et Html cet argument est gris (optionnel? pas nécessaire?), comment obtenir un tel effet).

Répondre

1

Je ne sais pas si je comprends bien votre question.

Le HtmlHelper est également instancié (c.-à-d.new HtmlHelper()) pendant le rendu de la page et le rendu du contrôle utilisateur. Ajax et URL aides s'instanciées aussi et c'est ce qui donne un accès aux différentes variables telles HttpContext etc.

Donc, pour que vous puissiez utiliser votre classe d'aide liée à ClassA vous aussi devrez instancier. Je pense alors la question mène à comment je fais cela? Vous devrez probablement étendre les classes ViewPage, ViewUserControl et ViewMasterPage.

0

Ce n'est pas évident parce que c'est si évident. En gros, vous étendez l'extension aide html:

public static HtmlString Foo(this HtmlHelper helper, string param) 
{ 
    //do whatever 
} 

Vous pouvez obtenir au contexte de la demande, etc., de HtmlHelper.

+0

Mayby il n'y a aucune raison de mettre en œuvre tout de début et vous avez raison: l'extension HtmlHelper est une meilleure façon ... Je voulais juste savoir pourquoi « (ce HtmlHelper HtmlHelper) » n'est pas nécessaire (grisées) dans Le code de View et mes extensions sont forcés de passer (ClassA classA) dans chaque méthode dans le code de View – Simon

+0

Honnêtement, je ne peux pas donner un sens à votre question - peut-être que vous devriez mettre quelque chose de plus précis que "classA". –

0

Comme je le vois, votre problème est que vous ne comprenez pas les méthodes d'extension.

si vous avez

static public class ClassAExt{ 
    public static MvcHtmlString Method(this ClassA classA) { 

    } 
} 

vous l'utilisez dans vue comme ceci:

<%: ClassAInstance.Method() %> 

de le faire, vous devez ajouter <add namespace="NamespaceOfClassA" /> aux pages de vous web.config/section namespaces. De cette façon, vous pouvez étendre la classe HtmlHelper pour faire ce dont vous avez besoin, donc il n'y a vraiment rien qu'elle ne puisse faire. Si vous voulez qu'il fasse quelque chose, il ne peut pas écrire par défaut une méthode d'extension. Téléchargez également MVC Futures assembly, il y a un dll Microsoft.Web.Mvc qui contient (entre autres choses) beaucoup de méthodes d'extension utiles pour HtmlHelper.

Si vous voulez savoir comment ils ont implémenté HtmlHelper ou AjaxHelper, vous pouvez vérifier le code source MVC.

lien pour télécharger les contrats à terme MVC et MVC code source: http://aspnet.codeplex.com/releases/view/41742

+0

Je sais comment l'utiliser dans View() il n'y a pas de magie. <% @ Import Namespace = "NamespaceOfClassA"%> résout les problèmes de visibilité dans les vues. La question principale n'était pas: "Comment étendre HtmlHelper" est simple et bien décrit dans de nombreuses sources, mais la question était "Comment écrire classe comme HtmlHelper" - je voulais créer une classe séparée et voulait connaître les dépendances qui me laissent pour faire face aux contrôleurs existants. Mais je vais vérifier dans le code source de MVC – Simon

+0

Désolé, j'ai eu une mauvaise impression de votre question. Dans ce cas, vous cherchez probablement quelque chose comme la réponse de Ahmad, mais ça va être beaucoup de travail. Il serait plus facile de simplement utiliser jQuery et d'injecter des choses en utilisant Html/Url helper. – Necros