63 votes

ASP.NET MVC: Assistants HTML personnalisés dans Razor

J'ai de la difficulté avec Html Helpers lorsqu'il est utilisé avec un Rasoir. Dit les aides a bien fonctionné dans MVC 2 avec le formulaire web moteur d'affichage. Mais pas dans le rasoir. L'erreur que je reçois au moment de l'exécution est:

Compiler Error Message: CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments

Source Error:


Line 1:  @using Wingspan.Web.Mvc;
Line 2:  @Html.IncrementalMenu(MenuBlock.Site)

L'expansion de l'Détaillés Sortie du Compilateur révèle:

d:\...\Views\Shared\MenuTop.cshtml(2,1): error CS1502: The best overloaded method match for 'System.Web.WebPages.WebPageExecutingBase.Write(System.Web.WebPages.HelperResult)' has some invalid arguments
d:\...\Views\Shared\MenuTop.cshtml(2,7): error CS1503: Argument 1: cannot convert from 'void' to 'System.Web.WebPages.HelperResult'

Cela m'indique que le rasoir n'aime pas mon aide, IncrementalMenu, de retour void (qui fonctionne très bien en MVC 2 formulaire web moteur de vues).

Je n'ai pas d'erreurs lors de la Compilation, bien que la ligne de code (@Html.IncrementalMenu(...)) est souligné rouge avec le message suivant:

Cannot implicitly convert type 'void' to 'object'

IncrementalMenu est dans l'Aile.Web.Mvc espace de noms. C'est la signature est la suivante:

public static void IncrementalMenu(this HtmlHelper html, MenuBlock menuBlock)
{
    // Uses an HtmlTextWriter to render a menu from the sitemap
}

Je suis emporté si je sais ce qui est faux...

PS:

Le MenuBlock paramètre est juste un enum qui définit la façon dont le menu doit s'afficher. Ne pas se concentrer sur ce que c'est très bien.

85voto

GvS Points 28137

Vous pouvez appeler votre assistant comme ceci:

 @{ Html.IncrementalMenu(MenuBlock.Site); }
 

Syntaxe WebForms

 <% Html.IncrementalMenu(MenuBlock.Site); %>
 

Vous appelez simplement votre méthode et la valeur de retour (s'il y en a une) est ignorée.

Un code comme celui-ci attend une valeur de retour et écrit la valeur de retour dans le flux HTML:

 @Html.YourHelper()
 

Syntaxe Webforms:

 <%: Html.YourHelper() %>
 

Le même, si la valeur du résultat! = IHtmlString:

 <%= Server.HtmlEncode(Html.YourHelper()) %>
 

49voto

awrigley Points 6468

Addendum:

Vous pouvez obtenir le même ou similaire, erreur avec @Html.RenderPartial. Dans ce cas, il est dû au fait que RenderPartial rend directement à la Réponse, n'est donc pas une chaîne de caractères et doit être codé à l'intérieur d'un "Rasoir bloc de code":

@{
   Html.RenderPartial(...);
}

Je soupçonne que c'est une des raisons pour lesquelles Microsoft ont inclus dans ASP.NET MVC le nouveau Html.Partielle. Comme Html.Partielle retourne une chaîne de caractères, il est correct d'écrire:

@Html.Partial

Ce qui semble beaucoup mieux. Étant donné que l'un de Rasoir déclaré l'un des objectifs est d'être facile sur l'oeil, c'est très probablement vrai.

Il est également le genre de qui fait de moi, au moins, se sentent plus à l'aise. Je sais ce que retourne une chaîne est, je le fais tout le temps. Mais "le retour à la Réponse" nécessite un peu plus de cerveau cycles chaque fois que je pense à elle.

Et il s'accorde avec le vieux adage qui dit que, finalement, Microsoft obtenir leurs produits dans la version 3. Par exemple, Access 97.

Ce qui est déprimant similé. Cos ils vissé les choses dans la version 4, c'est à dire, Access 2000...

22voto

Atanas Korchev Points 20945

Votre assistant HTML doit renvoyer MvcHtmlString qui représente le code HTML afin de fonctionner correctement avec Razor (et les autres moteurs de vue autres que WebFormsViewEngine).

 public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X