Descargar Codigo Fuente
Tal vez les suceda que alguna vez en su feliz programación de Asp.Net MVC quieren generar un formulario de entrada de datos que permita, sin los molestos tiempos de carga de postback, agregar N cantidad de elementos.
Es decir, generar un modelo de Cabecera-Detalle en el cliente, y luego poder leerlo del lado servidor utilizando solo MVC y Javascript. No, me refiero a SOLO MVC, es decir sin un ModelBinder personalizado, que sería la opción que primero nos viene a la mente gracias a la extensibilidad propuesta por el framework.
Podemos imaginarnos el siguiente ejemplo de modelo:
1: public class Materia
2: {
3: public int Codigo { get; set; }
4:
5: public string Nombre { get; set; }
6:
7: public List<Alumno> AlumnosInscriptos { get; set; }
8: }
Supongamos que queremos permitir al usuario generar una nueva materia y asignarle alumnos a la misma desde una lista de selección. Para simplificar el alumno va a estar definido por:
1: public class Alumno
2: {
3: public int Matricula { get; set; }
4:
5: public string Nombre { get; set; }
6: }
Entonces realizamos el siguiente formulario web:

En el mismo vamos a poder cargar las propiedades de la materia y mediante javascript permitiremos que se agreguen los alumnos al seleccionarlos del combo al presionar “Agregar”.
Pero… como hacemos luego para leer las propiedades de la materia y los N alumnos seleccionados del lado del servidor?
Muy fácil, utilizando el ModelBinder por defecto de MVC. Es decir, el framework ya viene preparado para este escenario, solo que (a mi apreciación) está poco documentado.
Es decir, en nuestro método de controlador solo tendremos que colocar la siguiente definición:
1: [AcceptVerbs(HttpVerbs.Post)]
2: public ActionResult Index(Materia nuevaMateria)
3: {
4: // HACER ALGO CON LA NUEVA MATERIA
5:
6: ViewData["CantidadAlumnos"] = nuevaMateria.AlumnosInscriptos.Count;
7:
8: return View("Alumnos");
9: }
Y automáticamente podemos leer la instancia de la clase Materia con sus alumnos relacionados.
Donde está el secreto???
Lo importante es que al generar las filas dinámicamente de la tabla de alumnos también generemos los inputs para los valores de los alumnos que vayamos agregando. Por ejemplo, al agregar la fila nueva también insertaremos dos inputs ocultos de html con los valores que requiere la clase Alumno, es decir Matricula y Nombre:
1: <input type="hidden" value="22" name="AlumnosInscriptos[1].Matricula"
2: id="AlumnosInscriptos[1].Matricula" />
3: <input type="hidden" value="Pedro" name="AlumnosInscriptos[1].Nombre"
4: id="AlumnosInscriptos[1].Nombre" />
Podemos observar la particularidad del nombre y id del tag, es decir, debemos llamarlos de la siguiente manera:
<NombrePropiedadPadre>[indice].<NombrePropiedadHijo>
O para nuestro ejemplo:
AlumnosInscriptos[0].Nombre
De esta manera, el ModelBinder interpretara que se trata un elemento perteneciente a nuestra colección y nos facilitara el trabajo.

Pongo a disposición el código fuente perteneciente al ejemplo de este post:
ListBinder.zip (264,49 kb)
Happy Programming!