2010-08-07 12 views
3

Je suis le livre Pro ASP.Net MVC2 et littéralement 90% de tout est nouveau pour moi. Je me sens comme un enfant dans un magasin de bonbons! :)Ma méthode d'extension ne s'enregistre pas

Les tests unitaires, l'injection de dépendances et d'autres choses sont vraiment nouveaux et très étrangers aux applications CRUD typiques que je crée.

Maintenant, j'ai des problèmes avec un test que le livre nous demande de concevoir.

[Test] 
     public void Can_Generate_Links_To_Other_Pages() 
     { 
      // Arrange: We're going to extend the HtmlHelper class. 
      // It doesn't matter if the variable we use is null. 
      HtmlHelper html = null; 

      // Arrange: The helper should take a PagingInfo instance (that's 
      // a class we haven't yet defined) and a lambda to specify the URLs 
      PagingInfo pagingInfo = new PagingInfo 
      { 
       CurrentPage = 2, 
       TotalItems = 28, 
       ItemsPerPage = 10 
      }; 

      Func<int, string> pageUrl = i => "Page" + i; 

      // Act 
      MvcHtmlString result = html.PageLinks(pagingInfo, pageUrl); 

      // Assert: Here's how it should format the links 
      result.ToString().ShouldEqual(@"<a href=""Page1"">1</a> 
              <a class=""selected"" href=""Page2"">2</a> 
              <a href=""Page3"">3</a>"); 
     } 

Ma variable html est une variable HtmlHelper. Il semble que la méthode d'extension PageLinks() n'est pas correctement enregistrée.

Où puis-je vérifier pour cela? Je réalise que cette question pourrait être un peu vague, mais toute aide sera merveilleuse.

EDIT:

Apparantly c'est là je me suis inscrit à la méthode d'extension. Bien que cela ne semble pas étendre quoi que ce soit. Au moins intellisnse ne le montre pas quand je le tape dans le code ci-dessus.

public static class PagingHelpers 
    { 
     public static MvcHtmlString PageLinks(this HtmlHelper html, PagingInfo pagingInfo, Func<int, string> pageUrl) 
     { 
      StringBuilder result = new StringBuilder(); 

      for (int i = 1; i <= pagingInfo.TotalPages; i++) 
      { 
       TagBuilder tag = new TagBuilder("a"); // Construct an <a> tag 
       tag.MergeAttribute("href", pageUrl(i)); 
       tag.InnerHtml = i.ToString(); 
       if (i == pagingInfo.CurrentPage) 
        tag.AddCssClass("selected"); 
       result.AppendLine(tag.ToString()); 
      } 

      return MvcHtmlString.Create(result.ToString());   
     } 
    } 

De plus, quelqu'un peut me dire comment configurer Visual Studio il que des copies de texte brut sans elle est indentation ridicule?

EDIT 2: Woops! Vous avez oublié de taper l'erreur:

Error 1 'System.Web.Mvc.HtmlHelper' does not contain a definition for 'PageLinks' and no extension method 'PageLinks' accepting a first argument of type 'System.Web.Mvc.HtmlHelper' could be found (are you missing a using directive or an assembly reference?) C:\Users\Sergio\documents\visual studio 2010\Projects\SportsStore\SportsStore.UnitTests\DisplayingPageLinks.cs 35 41 SportsStore.UnitTests

+0

Vous avez omis la partie où vous expliquez ce qui se passe, obtenez-vous une erreur de compilation? Les mauvais résultats? –

+0

Ce que je fais est de décaler le code au niveau le plus bas, le copier et le coller, puis annuler mes changements. –

+0

Le problème devrait être résolu en ajoutant une instruction 'using' au fichier contenant le test, en pointant sur l'espace de nommage de votre classe' PagingHelpers'. Par exemple, si 'PagingHelpers' est placé dans l'espace de noms' test123', vous devriez ajouter 'using using123;' en haut du fichier contenant votre test. – Alxandr

Répondre

8

Pour utiliser une méthode d'extension, vous devez inclure l'espace de noms dans lequel réside la classe de méthode d'extension. Vous devez également vous assurer que la classe de méthode d'extension est statique et accessible au code consommateur (par exemple, elle ne peut pas être interne si elle appartient à un autre assembly). Enfin, assurez-vous de ne pas oublier le mot clé this sur le type que vous étendez. Si toutes ces choses sont en place, vous ne devriez pas voir de problème.

+0

De même, si vous écrivez vous-même la méthode d'extension, n'oubliez pas le mot clé de paramètre 'this'. – devios1

+0

Vous avez raison, j'ai dû ajouter l'espace de noms using pour qu'il s'enregistre. –

+0

@Sergio ne hésitez pas à accepter la réponse si elle résout votre problème –

3

Vous pouvez ajouter l'espace de noms à toutes vos pages dans le web.config comme ceci:

<system.web> 
<pages> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="System.Linq"/> 
    <add namespace="System.Collections.Generic"/> 
    <add namespace="YourNameSpace.HtmlHelpers"/> 
    </namespaces> 
</pages> 

+0

C'est bon à savoir! – Shautieh

0

Utilisez

MvcHtmlString result = PagingHelpers.PageLinks(myHelper, pagingInfo, pageUrlDelegate); 

au lieu de

MvcHtmlString result = myHelper.PageLinks(pagingInfo, pageUrlDelegate); 
0

Vous besoin d'ajouter dans votre liste .cshtml au-dessus du code cette ligne

@model SportsStore.WebUI.Models.ProductsListViewModel 
0

Vous pouvez supprimer this HtmlHelper html, à partir des paramètres du code de la méthode pagelinks en classe PagingHelpers et remplacer HtmlHelper avec PagingHelpers comme celui-ci MvcHtmlString result = PagingHelpers.PageLinks(pagingInfo, pageUrl);

HtmlHelper n'est pas utilisé dans votre exemple.