Domanda

Sto avendo difficoltà con Html aiutanti quando viene utilizzato con il rasoio. aiutanti detti funzionava bene in MVC 2 con il motore di visualizzazione modulo web. Ma non in rasoio. L'errore che ottengo in fase di esecuzione è:

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'espansione del Salone dettagliata Compiler Output rivela:

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'

Questo indica a me che rasoio non piace il mio aiuto, IncrementalMenu, tornando vuoto (che funziona bene in vista MVC motore modulo 2 web).

ottengo errori in fase di compilazione, anche se la riga di codice (@ Html.IncrementalMenu (...)) è rosso sottolineato con il seguente messaggio:

Cannot implicitly convert type 'void' to 'object'

IncrementalMenu è nello spazio dei nomi Wingspan.Web.Mvc. Firma E 'è la seguente:

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

Sono soffiato se so cosa è sbagliato ...

PS:

Il parametro MenuBlock è solo un enum che identifica come il menu dovrebbero riprodurre. Non fissarsi su questo come questo va bene.

È stato utile?

Soluzione

È possibile chiamare il vostro aiuto in questo modo:

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

WebForms sintassi

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

Basta chiamare il metodo, e il valore di ritorno (se c'è) viene ignorata.

Un codice come questo si aspetta un valore di ritorno, e scrive il valore restituito al flusso html:

@Html.YourHelper()

Webforms sintassi:

<%: Html.YourHelper() %>

Lo stesso, se il valore result = IHtmlString:

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

Altri suggerimenti

Addendum:

È possibile ottenere lo stesso, o simili, errore @ Html.RenderPartial. In questo caso è dovuto al fatto che RenderPartial rende direttamente alla risposta, quindi non è una stringa e deve essere codificato all'interno di un "blocco di codice Razor":

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

ho il sospetto che è uno dei motivi per cui Microsoft ha incluso in ASP.NET MVC nuovo Html.Partial. Come Html.Partial fa restituire una stringa, è OK per scrivere:

@Html.Partial

Il che sembra molto meglio. Dato che uno degli obiettivi dichiarati del rasoio è quello di essere facile per gli occhi, questo è abbastanza probabile vero.

E 'anche un po' mi fa, per lo meno, si sentono più a suo agio. So cosa restituendo una stringa è, lo faccio tutto il tempo. Ma "ritorno alla risposta" richiede un paio di cicli di cervello ogni volta che penso di esso.

E si adatta con il vecchio adagio che finalmente Microsoft ottenere i loro prodotti proprio nella versione 3. EG, Access 97.

Che è una similitudine deprimente. Cos hanno incasinato le cose nella versione 4, vale a dire, Access 2000 ...

Il tuo HTML aiutante dovrebbe restituire MvcHtmlString che rappresenta l'html al fine di funzionare correttamente con Razor (e gli altri motori di vista che non sono il WebFormsViewEngine)

public static MvcHtmlString Label(this HtmlHelper html, string expression)
{
    return MvcHtmlString.Create("<label>" + expression + "</label>");
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top