2009-08-13 11 views
6

Mam witrynę, w której używam fluentNhibernate i Asp.net MVC. Mam widok edycji, który pozwala użytkownikowi na edycję 8 z 10 właściwości tego rekordu (obiektu). Po przesłaniu formularza i powiązania modelu dwa nieedytowalne pola powracają w modelu widoku jako puste ciągi lub jako domyślne wartości daty i godziny w zależności od typu właściwości.Jak zignorować/utrwalić wartości w MVC, gdy model widoku nie ma tyle pól, co model domeny?

Ponieważ używam również AutoMappera do mapowania mojego modelu widoku do mojej jednostki domeny, nie mogę po prostu załadować nowej kopii mojego obiektu z bazy danych i ręcznie ustawić 2 brakujące właściwości. Jaki jest najlepszy sposób na utrzymanie tych pól, których nie chcę edytować?

Jednym ze sposobów działania jest utrzymywanie wartości w ukrytych polach wprowadzania w moim widoku. To działa, ale wydaje się obrzydliwe. Doceniam wszelkie zalecenia. Czy w mojej AutoMaperze jest sposób na skonfigurowanie tej pożądanej funkcjonalności?

UPDATE: Ok, więc myślę, że nie staram się ignorować pola, staram się upewnić, że nie utrzymują null lub pustych wartości ciągów. Ignorowanie pól w AutoMapperzie właśnie to powoduje, że są ignorowane i mają zerową wartość, gdy próbuję je zmapować przed zapisaniem do mojego repozytorium.

+0

Czy istnieje powód, dla którego nieedytowalne pola są nawet częścią modelu widoku? – mxmissile

+0

Obecnie nie są częścią modelu widoku, który wydaje się być częścią problemu. Pola są "AddedBy" i "DateAdded". Po utworzeniu tego obiektu nigdy nie należy go zmieniać. Próbowałem podłączyć widok edycji bez utraty tych danych. Używanie Automapper null wyprowadza dane, kiedy mapuję z mojego modelu widoku do mojego modelu – shanabus

Odpowiedz

2

Program asp.net mvc DefaultModelBinder jest rozszerzalny i można go przesłonić, aby utworzyć własny schemat powiązania. Ale będzie to wymagało więcej pracy niż dwa "ukryte pola wprowadzania", co z mojego punktu widzenia nie jest aż tak obrzydliwe.

+1

Myślę, że ukryte pola wejściowe są obrzydliwe. Oprócz tego, że wysyłasz dane do klienta, aby można je było odesłać, można je również zmodyfikować.Używam pól nieedytowalnych dla rzeczy takich jak własność, data utworzenia, itd. –

+1

JW, to nie jest tak, że 2 ukryte pola wejściowe są obrzydliwe - ale następny widok, nad którym będę pracował, będzie zawierał więcej jak 10 ukrytych pól wejściowych. To kiedy zacząłem kwestionować tę metodę. Jest to aplikacja wewnętrzna, ale James S ma również dobry punkt - te pola mogą zostać zmienione. – shanabus

+0

Podczas gdy jestem niezdecydowany, aby sądzić, że jest to najlepsze rozwiązanie, jest to rozwiązanie, którego będę używał. – shanabus

2

Można powiedzieć Automapper ignorować 2 nieruchomości:

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

Possible related question.

+0

Próbowałem tego, po prostu otrzymuję puste wartości zamiast pustych ciągów, a właściwości DateTime wracają z wartościami domyślnymi. – shanabus

+1

Cóż, biorę to z powrotem - twoje rozwiązanie działa, jeśli załaduję obiekt z repozytorium przed mapowaniem. W ten sposób ignorowane pola nie zastąpią świeżo załadowanego obiektu - będą tylko pola, które chcę zaktualizować. Dzięki – shanabus

+1

Przepraszamy, odrzuciłem tę odpowiedź, ponieważ jak wspomniano w moim pierwszym komentarzu, funkcja Ignore() powoduje, że właściwość jest "nowsza". Oznacza to, że Ignorowanie właściwości DateTime ustawia ją na coś podobnego do '01/01/0001 ', a ignorowanie właściwości łańcucha ustawia ją na "", a nie na zero. – shanabus

0

Czy można użyć przeciążenia AutoMapper.Map, które akceptuje również TEntity ?!

entity = Mapper.Map(viewmodel, entity); 

Dopóki nie masz właściwości w swoim kodzie podglądu, nie zmieni to wartości w twoim obiekcie. Przyjmuje jednostkę, która jest przekazywana i stosuje do obiektu tylko właściwości z viewmodelu.

Powiązane problemy