2011-11-18 12 views
39

Sembra strano che non sia riuscito a trovare una spiegazione della differenza tra quei due aiutanti, quindi suppongo che sia qualcosa di ovvio ma mi sono perso.Differenza tra DropDownlist o DropDownListFor Html helper

Fondamentalmente sto cercando di decidere quale dovrei usare per il mio caso, con il seguente semplice modello:

public class Booking 
    { 
     public int ID { get; set; } 
     public Room Room { get; set; } 
     public DateTime StartTime { get; set; } 
     public DateTime EndTime { get; set; } 
     public ICollection<Equipment> Equipments { get; set; } 
     public string Who { get; set; } 
    } 

e voglio visualizzare una semplice camera DropDownList per l'aggiunta e la registrazione modifica della prenotazione.

Dopo aver fatto un sacco di Google in giro, sembra che probabilmente ho bisogno di un DropDopwListFor, ma non sono sicuro del perché e come?

+0

Grazie per i buoni esempi, ha senso e la mia domanda banale: D. Ma perché tutti mi danno un esempio di Dropdownlist per l'attrezzatura, ma sto chiedendo un esempio funzionante di stanza, ma presumo che funzioneranno praticamente allo stesso modo? –

risposta

76

adotta le seguenti due esempi:

@Html.DropDownListFor(
    x => x.EquipmentId, 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

e:

@Html.DropDownList(
    "EquipmentId", 
    new SelectList(Model.Equipments, "Id", "Text") 
) 

E 'ovvio che con il secondo esempio il nome della proprietà si sono vincolanti la discesa per è hardcoded come una magia stringa.Ciò significa che se si decide di rifattorizzare il modello e rinominare questa proprietà, il supporto degli strumenti che si sta utilizzando non ha modo di rilevare questa modifica e di modificare automaticamente la stringa magica codificata in potenzialmente più viste. Quindi dovrai cercare manualmente la sostituzione di & ovunque sia usato questo helper debolmente tipizzato.

Con il primo esempio, invece, si utilizza un'espressione lambda fortemente tipizzata legata alla proprietà del modello data, quindi gli strumenti sono in grado di rinominarlo automaticamente ovunque venga utilizzato se si decide di rifattorizzare il codice. Inoltre, se decidi di precompilare le tue visualizzazioni, riceverai un errore del compilatore che punta immediatamente alla vista che deve essere corretta. Con il secondo esempio (idealmente) o gli utenti del tuo sito (scenario peggiore) si otterrà un errore di runtime quando visitano questa particolare vista.

Gli helper fortemente tipizzati sono stati introdotti per la prima volta in ASP.NET MVC 2 e l'ultima volta che ho utilizzato un helper debolmente inserito era in un'applicazione ASP.NET MVC 1 molto tempo fa.

+0

Ottimo esempio :) – kbvishnu

+0

Aggiornamento per V6: puoi ovviamente bypassare la stringa magica usando il nuovo nome della parola chiave (nameof (x.EquipmentId) che risulta in EquipmentId. – TomTom

5

DropDownListFor seleziona automaticamente il valore selezionato utilizzando la proprietà specificata:

// Will select the item in model.Equipments that matches Model.EquipmentId 
@Html.DropdownListFor(m => m.EquipmentId, Model.Equipments); 

Un altro commento:

Non ce l'ho ICollection<Equipment> Equipments nel vostro modello di vista. Si dovrebbe avere una proprietà che restituisce un IEnumerable<SelectListItem>.

+0

Grazie per l'aiuto. Ma in realtà sto chiedendo l'elenco a discesa Stanza, cercando solo di ottenere l'idea. Inoltre, non capisco il tuo esempio in codice vista su DropdownListFor per le apparecchiature. Sembra che tu suggerisca di aggiungere un ViewModel che restituisce un oggetto IEnumberable nel mio ViewModel e restituirlo dal controllo alla mia vista invece del modello di prenotazione? Potresti fornire una base di esempio pienamente funzionante sul mio modello o su uno migliore? Ora sono bloccato perché non sono riuscito a trovare un esempio funzionante che possa essere inserito nel mio modello. –

2

Quando si desidera aggiungere una vista (aspx file) in cui questo DropDownList o DropDownListFor sarà dentro, rightclick-> Aggiungi vista e selezionare "Crea una vista fortemente tipizzato", quindi nella lista selezionare Booking classe. Successivamente aggiungi questa pagina.

Si può scrivere in questo modo:

@Html.DropdownListFor(m => m.Equipments , Model.Equipments); 

Poiché aggiungiamo fortemente vista digitato come Booking, si può avere:

m => m.ID, m => m.Room, m => m.StartTime 

... ecc

Nella tua servizi è possibile avere metodi per prendere i dati dal database, quindi utilizzare il metodo di questo servizio nel controller per passare i dati dal database per visualizzare. È possibile utilizzare ViewData nel controller:

ViewData["Equipments"] = new servicename().getdatalistfromdatabase().AsEnumarable(); 

Mettere AsEnumarable() alla fine della vostra lista presi dal database rende IEnumarable.

Poi a suo avviso, si può anche avere:

@Html.DropdownList("MyEquipments" , ViewData["Equipments"]); 

Un link sull'utilizzo Viewdata: http://msdn.microsoft.com/en-us/library/dd410596.aspx

Spero che ti aiuta.

+0

il link nella tua risposta è morto – dakait

+0

Credo che ViewData sia stato sostituito da ViewBag in MVC 3: http://weblogs.asp.net/scottgu/announcing-asp-net-mvc-3-release-candidate-2 ViewBag ha fortemente proprietà a -tipo rispetto alle stringhe utilizzate in ViewData. È la stessa logica del perché dovremmo usare DropDownListFor piuttosto che DropDownList. –

2

DropdownListFor è il supporto fortemente digitato e il nome viene assegnato da lambda Expression in modo che mostri l'errore di compilazione in caso di errori.

DropdownList non supportano questo.

Problemi correlati