すべてのフィールドがロードされていない厳密に型指定されたビューにデータを保存するための最良の方法

StackOverflow https://stackoverflow.com/questions/1876781

質問

のは、私は「のMyData」と呼ばれるテーブルに強く型付けされている編集ビューがあるとしましょう。ビューはテーブルから、いくつかの異なるフィールドを持つ複数のタブ、それぞれを有しています。パフォーマンスのためにタブが表示されている場合、データはロードされているので、あなただけのタブ1上のフィールドを編集して、フォームを送信した場合、タブ2用のデータがロードされません。

私はに実行している問題は、提出の上にあります。私は、データベース内の既存のレコードを見つけることの典型的なルーチンを実行し、渡された値を更新しています:

<AcceptVerbs(HttpVerbs.Post)> _
Function Edit(ByVal data As MyData) As ActionResult

    Using dc = New MyDataContext
        Dim orig = dc.MyDatas.Single(Function(x) x.id = data.id)
        orig.name = data.name
        orig.desc = data.desc
        ...
        SubmitChanges()
    End Using

    Return View(orig)

End Function

しかし、この方法では、タブがロードされたかわからないので、上の「DESC」とタブがロードされていない場合、このメソッドは、ユーザーが「DESC」フィールドを空白にし、データベースにNULL送信考えています。

どのように私はこれを構築することができる唯一のロードフィールドがデータベースに送信され、およびアンフィールドは無視されるように?

役に立ちましたか?

解決

あなたはUpdateModel(orig)を使用していない何らかの理由はありますか?

あなたではなく、手動でフォームの内容を通過し、値を割り当てるよりも結合モデルを、使用していた場合は、

、これはあなたのための世話をすることでしょう。デフォルトモデルの結合挙動がないフォームの値を対応しているプロパティを無視することである。

あなたは、このを見てみたいことがありポストに、そしてそこにリンク先の記事、結合モデルについての詳細を学ぶため。

他のヒント

私はちょうどそのタブ上のフィールドを更新し、各タブに個別のアクションメソッドを持つことをお勧めします。各タブのフォームは、単に適切な行動に提出する。

あなたは、タブのようなあなたのオリジナルモデルのようなものを再生回数パートここで、

たぶんのViewModelパターンは、ここであなたを助けることができます:

public class Tab1 
    {
        public string pproperty1 { get; set; }
        public string pproperty2 { get; set; }
    }
    public class Tab2
    {
        public string pproperty3 { get; set; }
        public string pproperty4 { get; set; }
    }
    public class Tab3
    {
        public string pproperty5 { get; set; }
        public string pproperty6 { get; set; }
    }
    public class ViewModels
    {
        public Tab1 TAB1 { get; set; }
        public Tab2 TAB2 { get; set; }
        public Tab3 TAB3 { get; set; }
    }
あなたはTab2 == null場合は掲示される値をバインドすると

それでは、あなたは、このプロパティはロードされませんどちらもユーザーによって変更されなかったことを知っています。

PD:C#のため申し訳ありませんが、時間が、私はコード化されたVB見られた。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top