9

Sto lavorando su un'applicazione Web ASP.NET MVC-4. Sto definendo il seguente all'interno del mio metodo di azione per costruire un SelectList:Il nome ViewBag può essere uguale al nome della proprietà Model in DropDownList?

ViewBag.CustomerID = new SelectList(db.CustomerSyncs, "CustomerID", "Name"); 

allora io sono il rendering mia DropDownListFor come seguire dentro il mio View:

@Html.DropDownListFor(model => model.CustomerID, (SelectList)ViewBag.CustomerID, "please select") 

come mostrato sto nominando la proprietà ViewBag a essere uguale al nome della proprietà Model che è CustomerID. Dal mio test, la definizione dello stesso nome non ha causato alcun problema o conflitto, ma dovrei evitarlo?

+1

Non farlo - causa problemi (ad esempio non è possibile ottenere alcuna convalida sul lato client) –

+0

@StephenMuecke convalida del clien su cosa? ViewBag non ha alcuna convalida –

+0

@teovankot, sulla proprietà del modello 'CustomerID' - con l'utilizzo dell'OP, non ci saranno attributi' data-val- * 'generati e l'utente seleziona la prima opzione" seleziona ", no verrà visualizzato errore di convalida (quando dovrebbe essere - presupponendo che 'CustomerID' è typeof' int') –

risposta

9

Si consiglia di non utilizzare lo stesso nome per la proprietà del modello e la proprietà ViewBag (e idealmente non si dovrebbe usare ViewBag a tutti, ma piuttosto un modello di vista con una proprietà IEnumerable<SelectListItem>).

Quando si utilizza @Html.DropDownListFor(m => m.CustomerId, ....), la prima opzione "Please Select" sarà sempre selezionata anche se il valore della proprietà del modello è stato impostato e corrisponde a una delle opzioni. Il motivo è che il metodo genera innanzitutto un nuovo IEnumerable<SelectListItem> basato su quello che è stato fornito per impostare il valore della proprietà Selected. Per impostare la proprietà Selected, legge il valore di CustomerID da ViewData e il primo che trova è "IEnumerable<SelectListItem>" (non il valore della proprietà del modello) e non può corrispondere a quella stringa con nessuna delle opzioni, quindi la prima opzione è selezionato (perché qualcosa deve essere).

Quando si utilizza @Html.DropDownList("CustomerId", ....), non data-val-* attributi verrà generato e non sarà possibile ottenere alcun validazione lato client

Fare riferimento this DotNetFiddle che mostra un confronto tra i possibili casi d'uso. Solo utilizzando nomi diversi per la proprietà del modello e la proprietà ViewBag funzionerà correttamente.

+0

ok, hai ragione ovunque –

+0

Errore nel violino, quando clicco sul pulsante di invio. Dice "L'elemento ViewData che ha la chiave" CustomerA "è di tipo" System.Int32 "ma deve essere di tipo" IEnumerable "." – Saurabh

+0

@Saurabh, Questo perché non ho ripopolato le "SelectLists" nel Metodo POST prima di restituire la vista (come per il metodo GET) - ma non è questo il punto del violino - è quello di mostrare che non è possibile ottenere il binding a 2 vie e/o la convalida se lo stesso nome viene utilizzato per la proprietà del binding to e il 'SelectList' (e se si desidera maggiori dettagli su tale errore - fare riferimento [questa domanda/risposta] (https://stackoverflow.com/questions/34366305/the-viewdata-item-that-has-the-key -xxx-è-di-tipo-system-int32-but-deve-essere-o) –

1

Non ci sono problemi ad usarlo. Non avrai alcun errore. ma la cosa migliore è legare la proprietà del modello.

+0

@ US3-57384 puoi saperne di più? –

+0

Vedere cosa uso nel mio codice. che risolve il problema e funziona correttamente. (IEnumerable ) ViewBag.RT – CrazyDev