2012-07-05 17 views
19

Ho un'applicazione ASP.NET MVC. Sto avendo più elenchi a discesa nella mia pagina (HTML SELECT), devo disabilitarli, dato che l'utente continua a selezionarli uno per uno. Quando l'utente lo rimanda al controller, sto diventando null come parametro della funzione (metodo di azione). Ho cercato e ho scoperto che HTML non invia il valore dei campi disabilitati nei dati del modulo. Sostituire l'attributo disabilitato con readonly non funzionerebbe come renderebbe il rendering a discesa.Ottieni il valore del menu a discesa disattivato in asp.net mvc

Sto generando i menu a discesa in modo dinamico utilizzando javascript mentre l'utente va avanti. Quindi non c'è un singolo menu a discesa, ma quanti ne vogliono l'utente.

Qualcuno può dirmi come devo ottenere i valori?

risposta

40

Una possibilità è quella di rendere l'elenco a discesa disabled="disabled" e includono un campo nascosto con lo stesso nome e il valore che permetterà di inviare questo valore al server:

@Html.DropDownListFor(x => x.FooId, Model.Foos, new { disabled = "disabled" }) 
@Html.HiddenFor(x => x.FooId) 

Se si deve disattivato la discesa in modo dinamico con javascript quindi semplicemente assegna il valore attualmente selezionato del menu a discesa al campo nascosto subito dopo averlo disabilitato.

3

Questo è il comportamento predefinito dei controlli disabilitati. Ti suggerisco di aggiungere un campo nascosto e impostare il valore di DropDownList in questo campo nascosto e lavorare con questo.

Qualcosa di simile:

//just to create a interface for the user 
@Html.DropDownList("categoryDump", (SeectList)ViewBag.Categories, new { disabled = "disabled" }); 
// it will be send to the post action 
@Html.HiddenFor(x => x.CategoryID) 
0

Si potrebbe anche creare il proprio sovraccarico DropDownListFor che accetta un parametro bool disabled e fa il lavoro pesante per voi in modo che il punto di vista non è ingombra di if disablethisfield then ....

Qualcosa tra queste linee potrebbe fare:

public static MvcHtmlString DropDownListFor<TModel, TProperty>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TProperty>> expression, IEnumerable<SelectListItem> selectList, bool disabled) 
{ 
    if (disabled) 
     return MvcHtmlString.Create(htmlHelper.HiddenFor(expression).ToString() + htmlHelper.DropDownListFor(expression, selectList, new { disabled="disabled" }).ToString()); 
    else 
     return htmlHelper.DropDownListFor(expression, selectList); 
} 

Ci sono 6 sovraccarichi per la sola DropDownListFor quindi è un sacco di monkeycoding ma si paga alla fine imho.

-2

prima di effettuare una chiamata $ ('# FooId'). RemoveAttr ('disabled')

Problemi correlati