2009-07-09 7 views
5

he modificado la aplicación Nerd Dinner para permitir la edición de registros secundarios añadiendo el siguiente código al DinnerForm.ascxActualización de Padres/registros secundarios con enlazadores de modelos en ASP.Net MVC

<p> 
    <%int i = 0; 
    foreach (NerdDinner.Models.RSVP rsvp in this.Model.Dinner.RSVPs) 
     { %> 

     <%= Html.Hidden("Dinner.RSVPs[" + i + "].RsvpID", rsvp.RsvpID)%> 
     <%= Html.Hidden("Dinner.RSVPs[" + i + "].DinnerID", rsvp.DinnerID)%> 
     <%= Html.TextBox("Dinner.RSVPs[" + i + "].AttendeeName", rsvp.AttendeeName)%> 
    <% i += 1; 
    } %> 
    </p> 

se encuentra prestando esto:

<p> 
    <input id="Dinner_RSVPs[0]_RsvpID" name="Dinner.RSVPs[0].RsvpID" type="hidden" value="36" /> 
     <input id="Dinner_RSVPs[0]_DinnerID" name="Dinner.RSVPs[0].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[0]_AttendeeName" name="Dinner.RSVPs[0].AttendeeName" type="text" value="kp" /> 
    <input id="Dinner_RSVPs[1]_RsvpID" name="Dinner.RSVPs[1].RsvpID" type="hidden" value="37" /> 
     <input id="Dinner_RSVPs[1]_DinnerID" name="Dinner.RSVPs[1].DinnerID" type="hidden" value="63" /> 
     <input id="Dinner_RSVPs[1]_AttendeeName" name="Dinner.RSVPs[1].AttendeeName" type="text" value="jim" /> 

    </p> 

No he modificado el método de acción de edición de publicación de DinnersControler. La cena para padres se actualiza como siempre, pero aparece el UpdateModel (cena); no está viendo/actualizando los registros de RSVP secundarios.

He intentado algunas variaciones en la representación de los registros secundarios para que los archivadores del modelo vean la colección, sin suerte.

Está actualizando los registros padre/hijo de una sola vez al llamar a UpdateModel (Parent); posible con los archivadores modelo actual?

Respuesta

4

No he podido hacer esto yo mismo.

Sé que puede actualizar un solo elemento secundario, es decir, Dinner.RSV automáticamente. Nunca he visto la posibilidad de actualizar un niño enumerable, lo que requeriría que el enlace supiera qué propiedad es el ID y lo busque (es decir, Dinner.RSVP.Where (r => r.RSVP_ID == input_id) y luego actualizar eso). No sé lo suficiente sobre el enlace personalizado para hacer algo como eso.

Sin embargo, lo que he hecho es hacer un bucle y especificar el RSVP y la int como prefijo:

por lo que:

UpdateModel("Dinner", Dinner); 

a actualizar el padre y luego:

int i = 0; 

foreach (var r in Dinner.RSVPs) { 
    UpdateModel(r, "Dinner.RSVPs[" + i++ + "]"); 
} 

No es tan limpio, pero funciona bien para mí. Sin embargo, podría tomar un poco más de esfuerzo construir validación (usted quiere validar todo al mismo tiempo, y asegurarse de no saltar a la vista en el primer RSVP con un error).

EDIT: Se corrigió el código para reflejar la solución de OP, incluido un error en el orden de mis parámetros. Habiendo dicho eso, me siento más cómodo usando la propiedad RSVP.ID que un número entero en ejecución. Siempre que sepa que Dinner.RSVPs será el mismo en el POST que el GET (estoy seguro de esto en mi código), entonces usar RSVP.ID funcionará. Si los RSVP son diferentes, solo los que estén presentes en ambos se actualizarán. Sin embargo, el uso de la int secuencial podría ocasionar la actualización del objeto incorrecto.

Espero que ayude, James

+0

@jamesshannon Esta respuesta está cerrada. Repare su Modelo de actualización en el ciclo para leer int i = 0; foreach (RSVP r en Dinner.RSVPs) { UpdateModel (r, "Dinner.RSVPs [" + i + "]"); i ++; } y podemos marcar esto hecho/respondido. –

0

Ok, nadie contesta. No conozco la aplicación nerddinner pero me interesó tu problema. Esperaba ver algunas respuestas pero, bueno, ninguna todavía. No está 100% seguro debido a la falta de familiaridad con ndinner, pero ¿podría estar relacionado con this post donde mencionan enlace/actualización solo cuando una propiedad se pasa explícitamente?

0

Su pregunta es si la actualización de los registros padre/hijo en una sola toma llamando UpdateModel (Padre); posible con los archivadores modelo actual?

Sí, esto es posible.Sin embargo, es no posible (sin algunas soluciones menores) si está utilizando Linq-to-Sql y sus objetos secundarios están expuestos a través de EntitySet<T> en lugar de algo como IList<T>. Creo que esto (¿ha sido?) Abordado en la próxima versión de MVC que saldrá con ASP.NET 4.0. Por el momento, sin embargo, la carpeta de modelo predeterminada de MVC no parece entender cómo trabajar con EntitySet.

Por favor, vea esto other answer Escribí sobre una pregunta relacionada hace algún tiempo, con detalles acerca de cómo estoy tratando (trabajando) esta situación en ciertos casos simples. Al hacer esto, tuve que dejar de preocuparme mucho sobre cuán "ideal" es esta solución desde una perspectiva DDD/OOP, como una compensación para simplemente lograr que MVC y LTS jueguen juntos muy bien con un mínimo esfuerzo.

Nota, voy a admitir que la solución de James S es probablemente más "pura", pero para poder hacer esto en "una sola toma" cuando pregunte, tendrá que esperar a ASP.NET 4.0 o utilizar una solución similar a la que encontrará en mi otra publicación.

¡Buena suerte!

Cuestiones relacionadas