Il modo migliore per salvare i dati su una visione fortemente tipizzato quando non tutti i campi sono stati caricati

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

Domanda

Diciamo che ho una vista di modifica che è fortemente tipizzato ad una tabella chiamata "MyData". La vista ha schede multiple, ciascuna con diversi campi della tabella. Per le prestazioni, i dati vengono caricati solo quando la scheda è visto, quindi, se si modifica solo un campo nella scheda 1 e inviato il modulo, non vengono caricati i dati per scheda 2.

Il problema che sto funzionando in è il submit. Sto facendo la routine tipica di trovare il record esistente nel database e l'aggiornamento dei valori passati:

<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

Tuttavia, questo metodo non sa che le schede sono stati caricati, quindi se la scheda con "disc" su di esso non è stato caricato, questo metodo pensa l'utente oscurato nel campo "disc", e invia NULL al database.

Come faccio a costruire questo in modo che i campi solo caricati vengono inviate al database e campi scaricati vengono ignorati?

È stato utile?

Soluzione

C'è qualche motivo non lo si utilizza UpdateModel(orig)?

Se si sta utilizzando vincolante modello, piuttosto che manualmente passare attraverso il contenuto della forma e assegnando i valori, questo sarebbe preso cura di per voi. Il comportamento di legame modello predefinito è di ignorare le proprietà che non hanno corrispondenti valori di modulo.

Si consiglia di dare un'occhiata a questo postare , e l'articolo collegato in là, per saperne di più sull'associazione modello.

Altri suggerimenti

mi sento di raccomandare avere un metodo di azione separato per ogni scheda che solo aggiorna i campi su quella scheda. La forma in ogni scheda sarebbe poi basta presentare l'azione appropriata.

Forse un modello ViewModel può aiutare qui, dove vi separi il vostro modello originale, come le schede vede qualcosa di simile:

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; }
    }

Quindi, quando si associa i valori iscritti se il Tab2 == null poi si sa che di questo non sono stati caricati né modificate dall'utente.

PD: Ci scusiamo per il c #, è stato un momento visto che VB codificato

.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top