2009-08-13 7 views
6

Ho un sito dove sto usando fluentNhibernate e Asp.net MVC. Ho una vista Modifica che consente all'utente di modificare 8 delle 10 proprietà per quel record (oggetto). Quando si invia il modulo e il modello si collega, i due campi non modificabili ritornano nel modello di visualizzazione come stringhe vuote o come valori DateTime predefiniti in base al tipo di proprietà.Come ignorate/persistono i valori in MVC quando il vostro modello di visualizzazione non ha tanti campi quanti il ​​vostro modello di dominio?

Poiché sto anche utilizzando AutoMapper per associare il mio modello di visualizzazione alla mia entità dominio, non posso semplicemente caricare una nuova copia del mio oggetto dal database e impostare manualmente le 2 proprietà mancanti. Qual'è il modo migliore per mantenere quei campi che non voglio modificare?

Un modo per funzionare è mantenere i valori nei campi di input nascosti nella vista. Funziona ma sembra grossolano. Apprezzo qualsiasi suggerimento. C'è un modo nel mio AutoMapper per configurare questa funzionalità desiderata?

UPDATE: Ok, quindi credo che non sto cercando di ignorare i campi, sto cercando di fare in modo che io non persistono valori di stringa null o vuoti. Ignorare i campi in AutoMapper fa proprio questo, vengono ignorati e sono nulli quando tento di mapparli prima di Salvato nel mio repository.

+0

C'è un motivo per cui i campi non modificabili sono anche parte del modello di visualizzazione? – mxmissile

+0

Attualmente non fanno parte del modello di visualizzazione, che sembra essere parte del problema. I campi sono "AddedBy" e "DateAdded". Una volta creato questo oggetto, questi non dovrebbero mai essere modificati. Stavo cercando di cablare una vista Modifica senza perdere quei dati. Usando Automapper null, i dati vengono estratti quando eseguo il mapping dal mio modello di visualizzazione al modello – shanabus

risposta

2

asp.net mvc DefaultModelBinder è estendibile e puoi sovrascriverlo per creare il tuo schema di binding. Ma ciò comporterà più lavoro di due "campi di input nascosti", che, dal mio punto di vista, non sono così grossolani.

+1

Penso che i campi di input nascosti siano grossolani. Oltre al fatto che stai inviando i dati al client solo per poterli restituire, può anche essere modificato.Io uso campi non modificabili per cose come proprietà, data di creazione, ecc. –

+1

JW, non è che 2 campi di input nascosti siano grossolani - ma la vista successiva con cui lavorerò conterrà più come 10 campi di input nascosti. Questo è quando ho iniziato a mettere in discussione questo metodo. Questa è un'applicazione interna, ma James S ha anche un buon punto: questi campi possono essere manomessi. – shanabus

+0

Mentre sono riluttante a credere che questa sia la soluzione migliore, è la soluzione che userò. – shanabus

2

Si può dire Automapper di ignorare le 2 proprietà:

Mapper.CreateMap<Source, Destination>() 
.ForMember(dest => dest.SomeValuefff, opt => opt.Ignore()); 

Possible related question.

+0

. Ho provato questo, ottengo solo valori nulli invece di stringhe vuote e le proprietà DateTime tornano con valori predefiniti. – shanabus

+1

Beh, riprendo quello - la soluzione funziona se carico l'oggetto dal repository prima di mappare. In questo modo i campi ignorati non sovrascriveranno l'oggetto appena caricato - saranno solo i campi che voglio essere aggiornato. Grazie – shanabus

+1

Spiacente, ho respinto questa risposta perché, come ho detto nel mio primo commento, Ignore() fa sì che la proprietà sia 'aggiornata'. Cioè, Ignorare una proprietà DateTime lo imposta su qualcosa come '01/01/0001 'e Ignorare una proprietà stringa lo imposta su "", non nullo. – shanabus

0

È possibile utilizzare l'overload di AutoMapper.Map che accetta anche TEntity ?!

entity = Mapper.Map(viewmodel, entity); 

Finché non si hanno le proprietà sul ViewModel, non cambierà i valori sul entità. Prende l'entità che viene passata e applica solo le proprietà da viewmodel all'entità.

Problemi correlati