Come ottenere un file 'codebehind' per una vista ASP.NET-MVC in RC1 da creare per impostazione predefinita

StackOverflow https://stackoverflow.com/questions/489415

  •  20-08-2019
  •  | 
  •  

Domanda

In RC1 il comportamento del modello per la creazione di una vista è cambiato.

Come spiegato dal post di Scott Gu sul release candidate una vista aspx appena creata non ha più un file code-behind di default.

  

In base al feedback che abbiamo & # 8217; abbiamo cambiato   view-template per non avere un   file code-behind per impostazione predefinita. Questo   il cambiamento aiuta a rafforzare lo scopo di   visualizzazioni in un'applicazione MVC (che sono   destinato esclusivamente al rendering   e non contenere alcun non rendering   codice correlato) e per la maggior parte delle persone   elimina i file non utilizzati nel file   progetto.

     

La build RC ora aggiunge la sintassi C # e VB   supporto per ereditare i modelli di vista   dalle classi base che usano generici.   Ad esempio, di seguito lo stiamo usando   con il modello di visualizzazione Edit.aspx & # 8211;   il cui & # 8220; eredita & # 8221; l'attributo deriva   dal tipo ViewPage:

Mi piace molto poter scrivere il codice specifico per la vista nel codebehind solo per generare la vista, specialmente se ho ripetute logiche in diverse parti della pagina dove non posso giustificare la creazione di una vista parziale.

La mia vera domanda: Scott ha detto di default - il che implica che posso cambiare quel comportamento, ma non riesco a vedere dove. È possibile? Creare manualmente un file codebehind e cambiare le cose è un problema.

Anche questo causa un ulteriore problema:

  • Se refactoring il nome del mio modello, la direttiva nella vista non viene aggiornata. Questa non è la fine del mondo, ma un chiaro vantaggio di averlo tipizzato fortemente.

Addendum: Per quelli di voi che si chiedono PERCHÉ Vorrei un codice qui dietro sono alcuni dei possibili motivi. Questo è un elenco cumulativo di quasi tutto ciò a cui ho pensato. Va da sé (bene dovrebbe) che non è necessario accedere a dati diversi da quelli già presenti nel modello. LINQ andrebbe bene per una semplice manipolazione dei dati del modello, ma LINQ to SQL NON lo farebbe! MVC è per le persone che dovrebbero già saperlo - ecco perché lo adoro - realizzato DA persone intelligenti PER persone intelligenti.

  • Controlli ASP.NET legacy di database: se non è disponibile un'alternativa o è necessaria una soluzione temporanea.
  • Visualizza la logica che richiede la ricorsione per creare una sorta di HTML nidificato o gerarchico.
  • Visualizza la logica che utilizza variabili temporanee. Mi rifiuto di definire le variabili locali nel mio tag soup! Li vorrei almeno come proprietà nella classe view.
  • Logica specifica solo per una vista o modello e non appartiene a un HtmlHelper. Come nota a margine, non credo che un HtmlHelper dovrebbe conoscere qualsiasi classe "Modello". Va bene se conosce le classi definite all'interno di un modello (come IEnumerable<Product>, ma non penso per esempio che dovresti mai avere un HtmlHelper che accetta un ProductModel.
  • I metodi HtmlHelper finiscono per diventare visibili da TUTTE le tue visualizzazioni quando digiti Html+dot e voglio davvero minimizzare questo elenco il più possibile.
  • E se volessi scrivere codice che utilizza HtmlGenericControl e altre classi in quello spazio dei nomi per generare il mio HTML in un modo orientato agli oggetti (o se ho un codice esistente che fa quello che voglio portare).
  • E se avessi intenzione di utilizzare un motore di visualizzazione diverso in futuro. Potrei voler tenere un po 'della logica a parte la minestra tag per rendere più facile il riutilizzo in seguito.
  • Che cosa succede se voglio essere in grado di rinominare le mie classi Model e far sì che rifletta automaticamente la mia vista senza dover andare su view.aspx e cambiare il nome della classe.
  • Che cosa succede se mi sto coordinando con un designer HTML di cui non mi fido per non sbagliare il 'tag soup' e voglio scrivere qualcosa al di là di un ciclo molto basilare nel file .aspx.cs.

Penso che le persone siano di partecontro "code-behind" poiché è stato tradizionalmente interpretato nel senso di "codice di gestione degli eventi" in contrapposizione a "l'altra metà della classe parziale di una vista", che è quello che è.

Il code-behind per le visualizzazioni va bene.

Non sono in disaccordo sul fatto che ingombra un po 'la struttura delle cartelle, ma è a questo che serve l'icona +. Voglio solo la possibilità di creare una vista con codebehind usando 'Aggiungi vista'.

È stato utile?

Soluzione

Per rispondere direttamente alla tua domanda, non penso che tu possa modificare questo valore predefinito. Potresti provare a modificare il modello (che sarebbe da qualche parte in% programfiles% \ Microsoft Visual Studio 9.0 \ Common7 \ IDE \ ItemTemplates & Quot;), ma non lo so per certo.

Tuttavia, il " MVC-way " per questo scenario è probabilmente quello di creare un helper personalizzato, in una classe separata.

Di recente ho scritto un'app Web che ha utilizzato Gravatar ( http://www.gravatar.com ) per genera immagini del profilo e ho continuato a scrivere la stessa personalizzazione < img > tag in tutte le mie visualizzazioni, quindi ho creato un aiuto: Html.Gravatar ()

Basta creare una classe statica " MyHelpers " oppure " GravatarHelpers " oppure " FooHelpers " e aggiungi metodi di estensione statici con firme come questa:

public static string Gravatar(this HtmlHelper htmlHelper, string emailAddress) {
    return htmlHelper.Image(...);
}

oppure, se usi viste fortemente tipizzate (ViewPage < T >) e vuoi approfittare di ciò puoi estendere HtmlHelper < T >

public static string Foo<TModel>(this HtmlHelper<TModel> htmlHelper, ...) {
    // Do stuff
    return // Stuff
}

Puoi facilmente cambiare HtmlHelper per UrlHelper o AjaxHelper. Credo che puoi anche accedere a ViewData, ecc. Da una proprietà ViewContext sull'helper.

Altri suggerimenti

Non sembra proprio una grande idea. Ogni commento che ho letto ha detto & Quot; non usare il code-behind; vorremmo che non ci fosse " ;. E sono d'accordo. Potresti provare a scrivere la tua logica nei metodi di estensione (tradizionalmente su HtmlHelper) come qui .

Sono dell'opinione che il codice dietro i file sia ancora utile. Mentre molte persone parlano di come sono cattive perché forniscono un metodo per rompere il modello di progettazione per cui MVC si impegna, non lo fanno intrinsecamente. Si può dire che la vista dovrebbe essere stupida, ma penso che sia probabilmente più accurato dire che la vista non dovrebbe occuparsi di una logica aziendale complessa. Deve tuttavia preoccuparsi degli aspetti della presentazione. Come tale, ci sono ancora elementi nella presentazione di informazioni che richiedono codice oltre al semplice HTML. Segue il ragionamento della separazione delle preoccupazioni (figuriamoci, pura leggibilità della vista) che il markup si occupa del markup con il codice dietro il supporto laddove il codice è necessario.

Luis Abreu ha scritto un buon articolo sull'argomento

I file codebehind in asp.net mvc non sono malvagi

FYI - In Visual Studio 2010, semplicemente aggiungendo il file di codice con il nome appropriato al file contenente la vista si assocerà automaticamente il nuovo file code-behind con la vista. Non è necessario rimuovere e aggiungere nuovamente i file per collegarli. Tuttavia, dovrai comunque modificare le classi ereditate per farlo funzionare come descritto da @Harry.

Vorrei anche avere code-behind come impostazione predefinita, ma non riesco a trovare il modo di cambiarlo. Questa pagina spiega come aggiungere un codice dietro una pagina: http: // msdn. microsoft.com/en-us/magazine/cc301556.aspx.

A mio avviso, le classi code-behind sono ideali per il controllo dei database e per apportare alcune piccole modifiche ai dati nel caso sia necessario (ad esempio, formattazione di data e valuta). Anche i ripetitori sono di gran lunga il modo più semplice per visualizzare elenchi di dati, non riesco ancora a trovare un modo per scorrere una raccolta di tipi anonimi e avere solo un'istruzione for in una pagina mi ricorda PHP: S

Ho risposto a questa domanda qui :

Come aggiungere una pagina Code-behind a una vista parziale

Sembra che non sia stato particolarmente complicato, ed è abbastanza fattibile Questa risposta ha funzionato per un 'ViewUserControl' parziale ma lo stesso dovrebbe valere

Ok.

Primo: aggiungi un file Class con la convenzione di .cs (ovvero view.ascx.cs)

Secondo: Aggiungi " usando System.Web.Mvc; " alla classe

Terzo: modifica la classe in Eredita da " ViewUserControl < > "

Quarto: aggiungi quanto segue all'intestazione della vista:

CodeBehind="View.ascx.cs" Inherits="Project.Views.Shared.View"

In quinto luogo: copia i file dalla soluzione e trascinali nuovamente per riassociare i due insieme

Nota: affinché funzioni con una visualizzazione MVC normale, è sufficiente ereditare la classe da " ViewPage "

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top