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?)

È stato utile?

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

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