2009-08-13 5 views
6

私はFluentNhibernateとAsp.net MVCを使用しているサイトを持っています。私はそのレコード(オブジェクト)の10のプロパティのうちの8つを編集できる編集ビューを持っています。フォームとモデルのバインドをサブミットすると、2つの編集不可能なフィールドが、プロパティのタイプに応じて、空の文字列またはデフォルトのDateTime値としてビューモデルに戻ります。ビューモデルにドメインモデルと同じ数のフィールドがない場合、MVCの値を無視/保持する方法はありますか?

ビューモデルをドメインエンティティにマップするためにAutoMapperも使用しているため、データベースからオブジェクトの新しいコピーを読み込んで、2つの不足しているプロパティを手動で設定することはできません。編集したくないフィールドを維持するにはどうすればよいですか?

私のビューの非表示の入力フィールドに値を保持する方法があります。それはうまくいくが、うまくいく。私はどんな勧告にも感謝します。 AutoMapperにこの機能を設定する方法はありますか?

UPDATE: [OK]を、だから私は、私は、私がnullまたは空の文字列値を保持していないことを確認するためにしようとしているフィールドを無視するつもりはありませんよね。 AutoMapperのフィールドを無視すると、それらは無視され、リポジトリに保存される前にそれらをマップしようとするとnullになります。

+0

編集不可能なフィールドがビューモデルの一部である理由はありますか? – mxmissile

+0

現在、これらはビューモデルの一部ではなく、問題の一部であると思われます。フィールドは 'AddedBy'と 'DateAdded'です。このオブジェクトが作成されると、変更されるべきではありません。私はそのデータを失うことなく編集ビューをワイヤリングしようとしていました。私のビューモデルから私のモデルにマップするときにAutomapper nullを使用すると、 – shanabus

答えて

2

asp.net mvc DefaultModelBinderは拡張可能で、独自のバインディングスキーマを作成するためにオーバーライドすることができます。しかし、これは2つの「隠された入力フィールド」よりも多くの作業を必要とします。私の視点では、それは総体ではありません。

+1

私は隠された入力フィールドがグロスだと思います。クライアントにデータを送信するだけで、それを送り返すことができるだけでなく、変更することもできます。私はオーナーシップ、作成日などのために編集不可能なフィールドを使用します。 –

+1

JW、2つの隠された入力フィールドは総体ですが、私が扱う次のビューには10個の隠し入力フィールドがあります。それは私がこの方法に疑問を持ち始めたときのことです。これは内部アプリケーションですが、James Sも良い点があります。これらのフィールドは改ざんされる可能性があります。 – shanabus

+0

これは最善の解決策だと私は躊躇していますが、それは私が使用する解決策です。 – shanabus

2

あなたは2つの特性を無視しAutomapperを伝えることができます。

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

Possible related questionを。

+0

私はこれを試しました。空の文字列ではなくヌル値を取得し、DateTimeプロパティはデフォルト値に戻ります。 – shanabus

+1

さて、私はそれを取り戻します。マッピングする前にオブジェクトをリポジトリからロードすると、あなたのソリューションは機能します。この方法では、無視されたフィールドは新しく読み込まれたオブジェクトを上書きしません。更新したいフィールドだけが上書きされます。ありがとう – shanabus

+1

申し訳ありませんが、私は私の最初のコメントで言及したように、Ignore()はプロパティが 'newed'になるため、この回答を拒否しました。つまり、DateTimeプロパティを無視すると、 '01/01/0001'のような値に設定され、文字列プロパティを無視するとnullにはなりません。 – shanabus

0

私はあなたが私が同じに同じ問題を抱えていると私は隠されたfildsソリューションをアレントと思うここにあなたの問題を解決http://www.codethinked.com/aspnet-mvc-think-before-you-bind(かのうソリューションのカップル)

を見つけるだろうと思います!

0

TEntityも受け入れるAutoMapper.Mapオーバーロードを使用できますか?

entity = Mapper.Map(viewmodel, entity); 

viewmodelにプロパティがない限り、エンティティの値は変更されません。エンティティが渡され、ビューモデルのプロパティのみがエンティティに適用されます。

関連する問題