La mejor manera de guardar los datos en una visión inflexible de tipos cuando no se cargan todos los campos

StackOverflow https://stackoverflow.com/questions/1876781

Pregunta

Vamos a decir que tengo una vista de edición que es de tipo fuerte a una tabla llamada "MyData". La vista tiene varias pestañas, cada uno con varios campos diferentes de la tabla. Para obtener un rendimiento, los datos sólo se carga cuando la lengüeta se ve, así que si sólo editar un campo en la ficha 1 y enviar el formulario, no se cargarán los datos de la ficha 2.

El problema que estoy corriendo en es en el presente. Estoy haciendo la rutina típica de encontrar el registro existente en la base de datos y la actualización de los valores pasados:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult

    Using dc = New MyDataContext
        Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
        orig.name = data.name
        orig.desc = data.desc
        ...
        SubmitChanges()
    End Using

    Return View(orig)

End Function

Sin embargo, este método no sabe qué fichas se cargaron, por lo que si no se carga con la pestaña "desc" en él, este método cree el usuario borró el campo "descripción", y lo envía a la base de datos NULL.

¿Cómo puedo construir esta manera que sólo los campos cargados son enviados a la base de datos, y los campos descargadas son ignorados?

¿Fue útil?

Solución

¿Hay alguna razón usted no está usando UpdateModel(orig)?

Si se utiliza el modelo de unión, en vez de manualmente a examinar el contenido del formulario y la asignación de los valores, esto sería tomado el cuidado de usted. El comportamiento de enlace modelo por defecto es ignorar propiedades que no tienen valores de la forma correspondiente.

Es posible que desee echar un vistazo a este publicar , y el artículo enlazado allí, a aprender más acerca de enlace de modelos.

Otros consejos

Yo recomendaría tener un método de acción separada para cada pestaña que simplemente actualiza los campos de esa ficha. La forma en cada ficha sería entonces simplemente someterse a la acción apropiada.

Tal vez un patrón de modelo de vista puede ayudar aquí, donde los separe su modelo original, como las pestañas ve algo como:

public class Tab1 
    {
        public string pproperty1 { get; set; }
        public string pproperty2 { get; set; }
    }
    public class Tab2
    {
        public string pproperty3 { get; set; }
        public string pproperty4 { get; set; }
    }
    public class Tab3
    {
        public string pproperty5 { get; set; }
        public string pproperty6 { get; set; }
    }
    public class ViewModels
    {
        public Tab1 TAB1 { get; set; }
        public Tab2 TAB2 { get; set; }
        public Tab3 TAB3 { get; set; }
    }

Así que cuando se unen los valores POST si el Tab2 == null entonces usted sabe que estas propiedades no se cargaron ni modificados por el usuario.

PD: Lo siento por el C #, se ha visto que una vez codificado VB

.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top