Question

J'éprouve des difficultés avec Html Helpers lorsqu'il est utilisé avec rasoir. aides dit a bien fonctionné dans MVC 2 avec le moteur vue formulaire web. Mais pas dans le rasoir. L'erreur que je reçois à 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 du salon détaillé 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 me indique que le rasoir n'aime pas mon aide, IncrementalMenu, vide de retour (qui fonctionne très bien dans les vues du moteur de forme Web MVC 2).

Je reçois aucune erreur à la compilation, bien que la ligne de code (@ Html.IncrementalMenu (...)) est rouge souligné avec le message suivant:

Cannot implicitly convert type 'void' to 'object'

IncrementalMenu est dans l'espace de noms Wingspan.Web.Mvc. Il est la signature se présente comme suit:

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

Je suis si je sais VENTE ce qui est faux ...

PS:

Le paramètre MenuBlock est juste un ENUM qui identifie la façon dont le menu doit rendre. Ne pas se focaliser sur ce que cela est très bien.

Était-ce utile?

La solution

Vous pouvez appeler votre aide comme ceci:

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

WebForms syntaxe

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

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

code comme celui-ci prévoit une valeur de retour, et écrit la valeur de retour au flux html:

@Html.YourHelper()

Webforms Syntaxe:

<%: Html.YourHelper() %>

La même, si la valeur de résultat = IHtmlString:

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

Autres conseils

Addendum:

Vous pouvez obtenir le même, ou similaire, avec erreur @ Html.RenderPartial. Dans ce cas, il est dû au fait que RenderPartial rend directement à la réponse, est donc pas une chaîne et doit être codé dans un « bloc de code Razor »:

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

Je suppose que c'est l'une des raisons pour lesquelles Microsoft a inclus dans ASP.NET MVC la nouvelle Html.Partial. Comme Html.Partial ne retourne une chaîne, il est OK pour écrire:

@Html.Partial

Ce qui ressemble beaucoup mieux. Étant donné que l'un des objectifs déclarés de rasoir est d'être agréable à l'oeil, ce qui est très probablement vrai.

Il aussi un peu me fait, au moins, se sentent plus à l'aise. Je sais ce que le retour d'une chaîne est, je le fais tout le temps. Mais « retour à la réponse » nécessite quelques cycles plus de cerveau chaque fois que je le pense.

Et cela correspond à le vieil adage que, finalement, Microsoft obtenir leurs produits à droite dans la version 3. EG, Access 97.

Ce qui est un simile déprimant. Cos ils vissent les choses dans la version 4, à savoir, Access 2000 ...

Votre aide HTML doit retourner MvcHtmlString qui représente le code html pour fonctionner correctement avec rasoir (et d'autres moteurs de vue qui ne sont pas le WebFormsViewEngine)

public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top