ASP.NET MVC: E 'un aiuto ha permesso di afferrare i dati? [chiuso]
-
22-08-2019 - |
Domanda
Tutti i miei controllori mio progetto ereditano da un controller di base, che ha una proprietà con il mio modello entità.
Let dire che ho una vista che mostra le città del mondo, e ha un'opzione per filtrare in base al paese. Il filtro paese è un elenco a discesa dei paesi dal database. L'helper HTML per l'elenco a discesa richiede un IEnumerable<SelectItem>
.
Ora con queste informazioni, è ok se creo un HtmlHelper
che assomiglia a questo:
public static IEnumerable<SelectListItem> GetCountries(HtmlHelper htmlHelper)
{
return (from c in ((BaseController) htmlHelper.ViewContext.Controller).Entities.Countries
orderby c.Name
select new SelectListItem() {Text = c.Name, Value = c.ID});
}
La questione non è se è possibile, ma se è ok secondo il modo di fare le cose MVC. (O dovrei mettere la raccolta dei paesi del Viewdata all'interno del controllore?)
Soluzione
Vorrei passare i dati come parametro al metodo GetCountries. La funzione HtmlHelper in realtà non dovrebbe conoscere le proprietà del controller di base - e se qualcuno dovesse usare mai su un controller che non eredita dalla base? Lo so lo so, è possibile controllare il codice, bla bla. Se siete veramente interessati a best practice, di evitare la dipendenza.
public static IEnumerable<SelectListItem> GetCountries(this HtmlHelper html, Countries countries) {
return from c in countries
order by c.Name
select new SelectListItem
{
Text = c.Name,
Value = c.ID
};
}
poi, a suo avviso:
<%=Html.GetCountries(this.Entities.Countries)%>
Altri suggerimenti
Scopri il modello ViewModel, è menzionato nel tutorial NerdDinner: http: // nerddinnerbook. s3.amazonaws.com/Part6.htm
In sostanza si crea una classe ViewModel che incapsula tutti i dati che potrebbe essere necessario per la visualizzazione. Così si avrebbe una classe che contiene un elenco di tutte le città e / o paesi, e quant'altro, istanziato / popolato nell'azione di controllo.
Quindi, è possibile digitare fortemente l'immagine per usare quella classe ViewModel, e blammo: hai tutti i dati necessari per il modulo
.Credo html aiutante deve restituire HTML. In modo da avere due approcci:
In primo luogo, se si vuole fare questo come hai iniziato, dal HtmlHelper preparare la vostra lista di elementi e quindi chiamare html.RenderDropDown con la lista inizializzato, elemento selezionato ecc ...
In secondo luogo, si può preparare in tutto il vostro modello, in modo da regolatore passerà oggetto avviata con tutti gli elementi necessari in modo da visualizzare in è possibile chiamare direttamente renderdropdown
applausi