2011-01-03 18 views
19

Come posso utilizzare i controlli personalizzati con Rasoio ASPNET.MVC?Controlli personalizzati con ASP.NET MVC Razor

Desidero utilizzare un controllo personalizzato su una visualizzazione Rasoio. per esempio:

<mycontrols:something>@Model.MyVar</mycontrols:something> 

o

<mycontrols:something myattribute="@Model.MyVar" /> 

Si prega di notare che il mio obiettivo è quello di utilizzare solo pochi controlli derivati ​​da MvcControl, solo per banali stoffe ui ripetitive.

Ho cercato di trovare una sintassi simile a @Register per scrivere in cima alla vista, ma senza alcun successo.

poi sono andato al web.config, aggiungendo

<pages> 
    <controls> 
     <add tagPrefix="mycontrols" namespace="mynamespace" assembly="myassembly"/> 
    </controls> 
</pages> 

ma sembra che i controlli personalizzati vengono ignorati nel rendering.

Qualcuno potrebbe aiutare?

... Potrebbe essere un po 'vecchio stile, ma a volte anche il controllo personalizzato potrebbe essere utile per rendere il vostro codice più pulito!

+0

Riprendendo le opinioni dei tutti gli altri qui, ma stai prendendo l'approccio sbagliato. Ci sono modi migliori per fare ciò che vuoi in Razor, e in effetti, MVC in generale. –

risposta

10

In ASP.NET I controlli del server personalizzato MVC devono essere evitati. La maggior parte di essi si basa su ViewState e PostBack, che sono nozioni che non esistono più in MVC. Si dovrebbe preferire l'uso di modelli, helper HTML per implementare alcune funzionalità riutilizzabili. Un altro problema con i controlli è la maggior parte di essi che incapsula una logica aziendale che recupera i dati da qualche parte e li restituisce, che è un pattern anti-MVC. In MVC è responsabilità del controllore manipolare il modello e recuperare i dati e passare un modello di vista alla vista che dovrebbe semplicemente visualizzarlo.

+0

Lo so, ma userò i controlli derivati ​​da MvcControls, solo per cose ui banali. – Fabrizio

+0

Cosa intendi per * MvcControls *? –

+0

Intendo implementare i controlli derivati ​​dalla classe MvcControl nello spazio dei nomi Microsoft.Web.Mvc.Controls dall'assembly MvcFutures. – Fabrizio

6

MVC utilizza una vista parziale, piuttosto che controlli personalizzati, e possono essere utilizzati in due modi che coprono praticamente tutto un controllo personalizzato può fare

  • RenderPartial che rende i dati già recuperato dal controller pagina
  • RenderAction che è simile ma ha la sua propria azione controller in modo da ottenere dati indipendentemente

L'unico scenario che posso pensare a dove varrebbe la pena mettere un controllo personalizzato su una vista in mvc è se si sta lavorando su un progetto di webform parzialmente migrato, e dubito che funzioni con qualcosa di diverso da WebFormsViewEngine.

19

La sintassi Razor non supporta affatto la nozione di controllo. Se si desidera utilizzare i controlli, è necessario utilizzare la sintassi ASPX (WebForms).

Tuttavia, lo schema MVC consigliato consente di utilizzare le funzioni helper html o le viste parziali. In Razor è anche possibile utilizzare la sintassi @helper per le funzioni di aiuto rapido.

+0

Penso che sia importante notare che "sintassi ASPX" può essere fuorviante qui. Ho visto domande su persone che chiedono come utilizzare i controlli server su ASP.NET MVC utilizzando il motore di visualizzazione ASPX. Ma sì, la tua risposta è corretta! –

1

Puoi farlo, anche se non lo consiglio, anche se non sono qui per giudicare. Potrei aggiungere che non mi aspetto che il postback e lo stato di visualizzazione continuino a funzionare, ma puoi almeno eseguire il rendering di tutto il codice HTML.

L'unico modo per fare ciò è un po 'un trucco, perché il rasoio non supporta i controlli del motore di visualizzazione dei Webform. Tuttavia, supporta le viste parziali effettuate nel motore di visualizzazione Webforms.Quindi una soluzione hacky è quella di includere una vista parziale con il vostro controllo in quanto tale:

Per esempio, diciamo che si desidera utilizzare il nastro ui ufficio web nel progetto MVC3, si potrebbe fare in modo includendo

<body> 
    <div> 
     @Html.Partial("_RibbonPartial") 
    </div> 
</body> 

dal tuo punto di vista. Dove _Ribbon è di tipo aspx

poi nella vostra visione parziale sufficiente utilizzare il controllo e impostare runat = "server" e metterlo all'interno di un modulo con runat = "server"

//_Ribbon.aspx 
<form id="form1" runat="server"> 
    <XyzControls:Manager ID="Manager1" runat="server" UITheme="Silver" /> 
    <XyzControls:OfficeRibbon ID="OfficeRibbon1" runat="server" ApplicationMenuColor="#267c29" 
     ApplicationMenuText="Item" ApplicationMenuType="Backstage"> 
//... rest of control code 
</form> 

Allora avete bisogno usare ajax per implementare gli eventi invece di usare il postback.

Quindi per ripulire, eliminare il codice generato dal motore di visualizzazione Webforms per il postback che non è necessario .. Puoi provare a tenerlo, non ho quindi non sono sicuro di cosa accadrà. So che ci sono modi per avere un ViewState falso e se si vuole veramente entrare in roba hacky disordinato, ma per rimuovere il codice aggiuntivo da webforms è possibile utilizzare il seguente jquery:

$(function() 
{ 
    // we don't need any of the webforms stuff 
    $("#__EVENTTARGET","#aspnetForm").parents("div:first").remove(); 
    $("#__EVENTVALIDATION","#aspnetForm").parents("div:first").remove(); 
}); 
1

ho avuto la stessa domanda . Volevo utilizzare il webcontrol personalizzato dalla pagina Razor/MVC. Uno non dovrebbe farlo con i controlli, cioè gestire il postback. Non è necessario l'eventcycle per sostenere questo, ma se la vostra unica richiesta è quella di utilizzare un 'controllo di rendering', si potrebbe un'istanza di rasoio, e controllare dove il rendering avviene:

@{ 
    var myControl = new mycontrols.something(); 
    myControl.myattribute = Model.MyVar; 
    mycontrol.RenderControl(new HtmlTextWriter(this.Output)); 
} 
Problemi correlati