6

Devo creare un metodo di helper html personalizzato. Per quanto ne so ci sono due modi:Sintassi ASP.NET MVC @helper vs Html Helper Metodi di estensione

  1. Utilizzare la sintassi del rasoio @helper. http://weblogs.asp.net/scottgu/archive/2011/05/12/asp-net-mvc-3-and-the-helper-syntax-within-razor.aspx

  2. Creare il metodo di estensione HtmlHelper.

Quale soluzione è migliore e perché? Quali sono i vantaggi e gli svantaggi?

Ho letto solo che in MVC 3 quando @helper viene creato globalmente in un file .cshtml separato, è impossibile utilizzare altri helper html incorporati. Non so forse in MVC 4 è possibile.

Per favore aiuto.

+0

possibile duplicato di [ASP.NET MVC: Razor @helper vs metodi di estensione a HtmlHelper - che è preferibile?] (Http://stackoverflow.com/questions/6285825/asp-net-mvc-razor-helper-vs -extension-methods-to-htmlhelper-which-is-preferr) – James

risposta

3

Quale soluzione è meglio e perché?

Dipende.

Quali sono i vantaggi e gli svantaggi?

  • A favore di un'estensione HtmlHelper personalizzato:
    • Funzionerà non importa quale motore di visualizzazione che si sta utilizzando
    • Si tratta di unità testabili
    • è portatile tra le applicazioni
  • Contro dell'estensione HtmlHelper personalizzata:
    • potrebbe diventare ingombrante per scrivere un sacco di logica HTML in C#
  • A favore di @helper:
    • non hanno visto alcuna, non ho mai usarlo
  • Contro di @helper:
    • Non l'ho mai visto, non lo uso mai

In realtà il fatto è che @helper IMHO è completamente inutile. Quando vuoi i vantaggi che ho citato su un'estensione HtmlHelper personalizzata, puoi creare un'estensione HtmlHelper personalizzata.

E se si è confrontati con alcuni degli svantaggi che ho citato sull'estensione HtmlHelper personalizzata, si, beh, utilizzare una vista parziale.

ho letto solo in MVC 3 quando @helper viene creato a livello globale in separata .cshtml il file è impossibile usare altri soccorritori html build-in.

Questo è sbagliato. Si potrebbe perfettamente usare altri helper Html. Devi solo passarli come parametri:

@helper FooBar(HtmlHelper html) { 
    feel free to use the html helper here 
} 

e quando si consumano da una visione:

@HelperName.FooBar(Html) 
+0

** Domanda successiva **: Possiamo chiamare gli helper HTML esistenti da un metodo di estensione helper HTML personalizzato? Ad esempio, se costruisco un helper HTML personalizzato chiamato "CustomFieldDateTime", posso eseguire il rendering di un Html.ValidationMessage ("control4") all'interno? O devo usare la sintassi @helper o la vista parziale? –

+1

Sì, puoi chiamare gli helper HTML esistenti all'interno di un helper personalizzato. Puoi farlo portando il metodo di estensione in scope ('using System.Web.Mvc.Html') e poi chiamando il metodo richiesto. –

+0

Grazie, Darin. Ho avuto successo con la tua soluzione. Ho usato il seguente frammento di codice all'interno del mio metodo di estensione HtmlHelper: 'IHtmlString validationMsg = helper.ValidationMessage (controlName);' Dove helper è "questo helper HtmlHelper". –

3

Possono essere come utente Controls Vs personalizzato

Usa @helper per la formattazione stile rasoio in vista. Utilizzare i metodi di estensione per soluzioni generiche, per esempio sovraccaricare una creazione di etichetta che richiede parametri aggiuntivi.

Si possono trovare spiegazione dettagliata di esempi here

7

Un beneficio per @helper è che, dal momento che il codice è all'interno della vista, è possibile apportare modifiche ad esso senza dover ricompilare il tuo codice. Ciò consente di modificare l'helper in modo rapido e semplice durante lo sviluppo. Personalmente preferisco mantenere il markup all'interno delle visualizzazioni, se possibile, proprio per questo motivo.

Un vantaggio correlato di @helper è che il tuo HTML trarrà vantaggio da intellisense, mentre la scrittura di codice HTML nel codice C# non ha alcun vantaggio.

Inoltre, se stai scrivendo un helper che non è destinato a essere riutilizzabile al di fuori di una singola vista, allora @helper rende più semplice chiarirlo. Un metodo di estensione HtmlHelper potrebbe confondere se solo una vista è destinata a usarlo (a meno che non si riesca a inserirlo in una classe e in uno spazio dei nomi in cui solo quella vista vedrebbe mai il metodo di estensione).

Problemi correlati