2012-09-05 12 views
6

tengo dos modelos:Lista de modelos de Modelo en MVC

class ModelIn{ 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address { get; set; } 
} 

class ModelOut{ 
    public ModelOut(){ People = new List<ModelIn>();} 
    public List<ModelIn> People { get; private set;} 
    public string Country { get; set; } 
} 

Y tengo controlador de edición ModelOut:

public ActionResult People() 
{ 
    ... 
    return View(SomeModelOutInstanceWith3People); 
} 
[HttpPost] 
public ActionResult(ModelOut items) 
{ 
    ... 
} 

En vista tengo como algo:

<% using (Html.BeginForm()) { %> 
    <%: Html.EditorFor(m => Model.Country) %> 
    <% for(int i = 0; i < Model.People.Count; ++i){ %> 
     <%: Html.EditorFor(m => Model.People[i].FirstName) %> 
     <%: Html.EditorFor(m => Model.People[i].LastName) %> 
     <%: Html.EditorFor(m => Model.People[i].Address) %> 
    <% } %> 
    <input type="submit" /> 
<% } %> 

Funciona todo bien, pero en la acción posterior tengo elementos vacíos de ModelOut. Puedo ver en los registros que los datos se envían correctamente.

He intentado todo, nada funciona.

+0

Todo funcionaba bien cuando tuve IList en lugar de ModelOut – Ari

+2

Intente cambiar el nombre a 'public ActionResult People (ModelOut model)' en lugar de simplemente 'm'. MVC puede ser quisquilloso con los nombres de los parámetros. – Dai

+0

@David param name is items. Tengo este nombre cuando estaba trabajando con la lista , así que creo que el problema debe estar en otro lugar – Ari

Respuesta

0

@Dai tenían razón. MVC me permite usar elementos para el nombre de la instancia del modelo cuando se trata de una instancia de List, pero no me permite usarlo para ModelOut.

Después de cambiar el nombre items al model funciona bien.

0

El motivo de su problema podría ser una falta de coincidencia de nombres ... por lo que recuerdo, el archivador de modelo predeterminado no hace su trabajo correctamente debido a esta falta de coincidencia de nombres ... esto significa que debe especificar más información al aglutinante de modelo para hacer su trabajo mejor ... prueba a actualizar el código de vista a usar el siguiente código para cada propiedad ...

<%= Html.EditorFor(string.Format("People[{0}].FirstName", i), Model.People[i].FirstName) %> 

el código de la vista anterior generará el siguiente marcado

<input id="People_0__FirstName" name="People[0].FirstName" type="text" /> 

I podría tener un problema sintáctico anterior, pero supongo que puede obtenerlo ht con la ayuda de Visual Studio

+0

Es exactamente lo que generó mi código. '' – Ari

+0

ok ... ahora que sepa que la marca no está mal. ¿Puede publicar su código de vista completo tal como está ... que incluye el diseño y las especificaciones del modelo? también probé tu escenario y funcionó bien ... por lo que debe haber algo externo que impida que el enlazador de modelos vincule datos ... – NiK

+0

Está resuelto.Mira los comentarios debajo de la pregunta – Ari

1

¿Has probado simplemente <%: Html.EditorFor(m => m.People) %>?

MVC debe recorrer la lista por sí mismo.

Además, tenga en cuenta cómo especifica sus lambdas, debería ser m => m en lugar de m => Model.

PS. Yo uso MVC3 ...

+0

Necesito pasar, porque los editores no son solo códigos que necesito allí. En mi código tengo 'm => m ...', reescribí con error. – Ari

+1

Puede poner este otro código en una plantilla de editor personalizado ... –

Cuestiones relacionadas