2012-03-09 14 views
7

En uno de los formularios en los que estoy trabajando, si el usuario selecciona DropDownList "Tipo", según el valor seleccionado, mostraría dinámicamente un conjunto de otros DropDownLists.Contabilización de formularios dinámicos en ASP.NET MVC 3

Por ejemplo, Tipos: Coche, Apartamento Al seleccionar "Coche", se agregarán dinámicamente dos nuevas listas de descenso "Precio" & "Modelo". Al seleccionar "Crear", se agregarán dinámicamente dos nuevas DropDownLists "Área" & "Piso"

Mi pregunta es cómo manejar los datos publicados en el servidor? Por lo general, recibo los campos del formulario y ellos obtienen el "modelo vinculado" automáticamente. Pero, ¿qué ocurre con los campos dinámicos que se agregaron en la página según la selección del usuario? ¿Cómo los recuperaré dentro de la Acción?

Gracias

+0

¿Ha intentado utilizar ajax –

+0

@COLDTOLD Este es un problema del lado del servidor, Ajax no es una solución que tenga ningún impacto –

+0

@Marek Karbarz puede actualizar parte parcial de la página mediante la adición de nuevos elementos, con ajax –

Respuesta

2

Ah malentendido esto.

Si sabes qué Dropdowns se pueden agregar, siempre tendría un valor en tu modelo. MVC los establecerá como un valor predeterminado si no se recibe nada.

EDIT: Usted todavía puede acceder a la colección de formularios de una manera más cruda de controladores withing usando

Request.Form.Keys 
Request.QueryString.Keys 

Request["ExpectedDropdownName"] 

Por supuesto, estas serán todos los valores publicados por su forma por lo que tendrá una forma de reconocer una de tus menús desplegables como un prefijo o algo. Por ejemplo

foreach (var key in Request.Form.AllKeys.Where(k => k.StartsWith("dynamic-dropdown-")) 
    { 
     var selectedValue = Request[key]; 
    } 

Todavía no entiendo muy bien cómo se va a procesar los menús desplegables dinámicas, si usted no sabe lo que van a ser y esto puede causar algunos problemas y hará que la validación totalmente dinámico y el lado del cliente (no es 100% seguro). Eso podría presentar también algunos problemas de seguridad, pero hay algunos casos en los que podría usar esto y supongo que tiene uno de ellos.

Si ese no es el caso, no olvide que solo porque un Modelo tiene una propiedad, no tiene que volverse a publicar.

Se podría hacer:

public class MyModel 
{ 
    [Required] 
    public string FirstName { get; set; } 

    public string PossibleDropdown1 { get; set; } 

    public string PossibleDropdown2 { get; set; } 
} 

El controlador hará lo mejor es para poblar el modelo, pero si usted no pasa algunos campos de vuelta de la forma, que sólo será nula y la acción son todavía trabajo.

También he implementado escenarios mucho más complejos como este usando objetos que son hijos del modelo principal y todos los nulos. Eso requiere un poco de trabajo sofisticado alrededor de las llamadas de ajax a EditorTemplates en vistas simuladas para garantizar que prefixing sea correcto para MVC analizar, pero no entraré en eso aquí.

+0

El problema es , las DropDowns son dinámicas y no hay manera de saber de antemano qué DropDowns se mostraría. Una pregunta, sin embargo, en caso de que establezca como entrada a la Acción un ViewModel sin las DropDowns, ¿hay alguna manera de acceder a FormsCollection dentro del cuerpo del método de Acción? – Bill

8

Puede utilizar el FormCollection para acceder a todos los campos de la página. Sin embargo si no se pierden el modelo automático vinculante y tendrá que recorrer la colección formulario para encontrar los valores de la siguiente manera:

public ActionResult ActionMethod(FormCollection formCollection) 
{ 
    foreach (var key in formCollection.AllKeys) 
    { 
     var value = formCollection[key]; 
    } 
} 

Por supuesto que también podría incluir sólo los menús desplegables dinámicos en su modelo.