0

製品エンティティの一部である画像プロパティがあるシナリオがあります。

ユーザーがMVC3画面を介してこの製品を編集できるようにすると、画像プロパティは次のように表示されます。

<div class="editor-label">Image</div>
    <div class="editor-field">
        @if (Model.ProductItem.ImageData == null)
        {
        @:None
        }
        else
        {
            <img alt="Product Image" width="125" height="125" 
            src="@Url.Action("GetImage", "Product", new { Model.ProductItem.ProductId     })" />
        }
    </div>

    <div>Upload new image: <input type="file" name="Image" /></div>

現在の画像を編集するには、ユーザーは基本的にアップロードを介して新しい画像を選択します。これは、現在のImageDataプロパティがnullであり、モデルの状態が無効であることを意味します。新しい画像は投稿に戻っているので、これをImageDataプロパティに設定し、モデル検証エラーをクリアします。

次に、context.savechanges()メソッドを介して「変更」を保存しますが、コンテキストはこの特定のエンティティに変更があるとは見なしません。これを回避するために、編集時に次のことを行いました。

      if (context.Products.Local.Count() == 0)
            {
                Product procurr = context.Products
                    .Where(p => p.ProductId == product.ProductId)
                    .FirstOrDefault();

                context.Entry(procurr).CurrentValues.SetValues(product);    
            }

基本的に、更新したい製品のリスト内のアイテムを強制的に更新しています(procurrはリスト内のアイテムであり、productは保存したい新しい編集済みの値です)

私の質問は、(A)コンテキストを使用するという観点からこれを行うための最良の方法であり、(B)UIでこれを行うためのより良い方法、つまり、古い画像と新しい画像を結び付ける方法はありますか?モデルは自動的に変更を取得しますか?

ありがとう

4

1 に答える 1

0

あなたがしたことは正しいように見えます。

基本的な考え方は、サーバーからデータを取得してブラウザーに返すと、使用しているEFコンテキストが閉じられるというものです。

ブラウザから返信が返ってきたら、更新しようとしている行にデータを接続する必要があります。

IDに基づいて行を読み取り、関連するフィールドを更新してから、変更の保存を実行することは、適切なアプローチです。

于 2012-07-08T15:52:06.090 に答える