2009-08-13 8 views
6

Ich habe eine Website, wo ich fluentNhibernate und Asp.net MVC verwende. Ich habe eine Bearbeitungsansicht, mit der Benutzer 8 der 10 Eigenschaften für diesen Datensatz (Objekt) bearbeiten können. Wenn Sie das Formular und die Bindung des Modells senden, werden die zwei nicht bearbeitbaren Felder im Ansichtsmodell als leere Zeichenfolgen oder als standardmäßige DateTime-Werte zurückgegeben, abhängig vom Typ der Eigenschaft.Wie können Sie Werte in MVC ignorieren/beibehalten, wenn Ihr Ansichtsmodell nicht so viele Felder enthält wie Ihr Domänenmodell?

Da ich auch AutoMapper verwende, um mein Ansichtsmodell meiner Domäneneinheit zuzuordnen, kann ich nicht einfach eine neue Kopie meines Objekts aus der Datenbank laden und die 2 fehlenden Eigenschaften manuell festlegen. Was ist der beste Weg, diese Felder zu erhalten, die ich nicht bearbeiten möchte?

Eine Möglichkeit, die funktioniert, besteht darin, die Werte in ausgeblendeten Eingabefeldern in meiner Ansicht beizubehalten. Das funktioniert, fühlt sich aber eklig an. Ich freue mich über Empfehlungen. Gibt es in meinem AutoMapper eine Möglichkeit, diese gewünschte Funktionalität zu konfigurieren?

UPDATE: Ok, also ich denke, ich bin nicht die Felder zu ignorieren versuchen, ich versuche, um sicherzustellen, dass ich nicht null oder eine leere Zeichenfolge Werte anhalten kann. Das Ignorieren der Felder in AutoMapper macht genau das, sie werden ignoriert und sind null, wenn ich versuche, sie vor Saved in meinem Repository abzubilden.

+0

Gibt es einen Grund, warum die nicht editierbaren Felder sogar Teil des View-Modells sind? – mxmissile

+0

Derzeit sind sie nicht Teil des Ansichtsmodells, das anscheinend Teil des Problems ist. Die Felder sind 'AddedBy' und 'DateAdded'. Sobald dieses Objekt erstellt wurde, sollten diese niemals geändert werden. Ich habe versucht, eine Bearbeitungsansicht zu verkabeln, ohne diese Daten zu verlieren. Mit Automapper Nulls Daten, wenn ich von meinem Ansichtsmodell zu meinem Modell abbilde – shanabus

Antwort

2

Der asp.net mvc DefaultModelBinder ist erweiterbar und Sie können ihn überschreiben, um ein eigenes Bindungsschema zu erstellen. Aber das wird mehr Arbeit erfordern als zwei "versteckte Eingabefelder", was meiner Ansicht nach nicht so eklatant ist.

+1

Ich denke, dass die versteckten Eingabefelder grob ist. Neben der Tatsache, dass Sie Daten nur an den Client senden, damit diese zurückgesendet werden können, können Sie auch Änderungen vornehmen.Ich verwende nicht editierbare Felder für Dinge wie Besitz, Erstellungsdatum usw. –

+1

JW, es ist nicht so, dass 2 versteckte Eingabefelder grob sind - aber die nächste Ansicht, mit der ich arbeiten werde, wird mehr wie 10 versteckte Eingabefelder enthalten. Das war, als ich anfing, diese Methode in Frage zu stellen. Dies ist eine interne Anwendung, aber James S hat auch einen guten Punkt - diese Felder können manipuliert werden. – shanabus

+0

Während ich zögerlich zu glauben, dass dies die beste Lösung ist, ist es die Lösung, die ich verwenden werde. – shanabus

2

Sie können AutoMapper sagen die 2 Objekte zu ignorieren:

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

Possible related question.

+0

Ich habe dies versucht, ich bekomme nur Null-Werte anstelle von leeren Zeichenfolgen und die DateTime-Eigenschaften kommen mit Standardwerten zurück. – shanabus

+1

Nun, ich nehme das zurück - Ihre Lösung funktioniert, wenn ich das Objekt vor dem Mapping aus dem Repository lade. Auf diese Weise werden die ignorierten Felder das frisch geladene Objekt nicht überschreiben - nur die Felder, die ich aktualisieren möchte. Danke – shanabus

+1

Sorry, ich habe diese Antwort abgelehnt, weil, wie ich in meinem ersten Kommentar erwähne, Ignore() bewirkt, dass die Eigenschaft "neu" wird. Das heißt, das Ignorieren einer DateTime-Eigenschaft setzt es auf etwas wie '01/01/0001 'und das Ignorieren einer String-Eigenschaft setzt es auf "", nicht auf Null. – shanabus

0

Können Sie die AutoMapper.Map-Überladung verwenden, die auch TEntity akzeptiert ?!

entity = Mapper.Map(viewmodel, entity); 

Solange Sie auf Ihrem Viewmodel die Eigenschaften nicht haben, wird es nicht die Werte auf Ihrem Unternehmen ändern. Es übernimmt die übergebene Entität und wendet nur die Eigenschaften aus dem Viewmodel auf die Entität an.

Verwandte Themen