2012-07-05 33 views
19

Tengo una aplicación ASP.NET MVC. Tengo una lista desplegable múltiple en mi página (HTML SELECT), tengo que deshabilitarlos, ya que el usuario los selecciona uno a uno. Cuando el usuario lo vuelve a enviar al controlador, estoy obteniendo nulo como parámetros de la función (método de acción). Busqué y encontré que HTML no envía el valor de los campos deshabilitados en los datos del formulario. Reemplazar el atributo disabled por readonly no funcionaría, ya que haría que el menú desplegable funcione.Obtiene el valor del menú desplegable deshabilitado en asp.net mvc

Estoy generando las listas desplegables dinámicamente mediante javascript a medida que el usuario avanza. Entonces, no hay un solo menú desplegable, sino tantos como quiera el usuario.

¿Puede alguien decirme cómo debo obtener los valores?

Respuesta

40

Una posibilidad es hacer la lista desplegable disabled="disabled" e incluyen un campo oculto con el mismo nombre y el valor que le permitirá enviar este valor al servidor:

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

Si usted tiene a personas con discapacidad en el menú desplegable de forma dinámica con javascript, simplemente asigne el valor seleccionado actualmente del menú desplegable al campo oculto justo después de desactivarlo.

3

Este es el comportamiento predeterminado de los controles deshabilitados. Le sugiero que agregue un campo oculto y establezca el valor de su DropDownList en este campo oculto y trabaje con esto.

Algo así como:

//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

También puede crear su propia sobrecarga DropDownListFor que acepta un parámetro bool disabled y hace el trabajo pesado para usted para que su vista no está lleno de if disablethisfield then ....

Algo entre estas líneas podría hacer:

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); 
} 

Hay 6 sobrecargas para DropDownListFor solo por lo que es una gran cantidad de monkeycoding pero vale la pena al final en mi humilde opinión.

-2

antes de enviar la llamada $ ('# FooId'). RemoveAttr ('disabled')

Cuestiones relacionadas