2

LinqtoSQLデータベースコンテキストを使用してASP.NETDynamicData Webサイトで作業していますが、質問があります。私のテーブルの1つであるARReportsには、EditedBy、ReleaseDate、その他のフィールドなどの他のデータとともに、ReportDetailsオブジェクトに逆シリアル化できる生のXMLデータを含む列があります。

ReportDetailsには、カスタムEdit.aspxページで公開したいいくつかのパブリックプロパティがあります。

私の目標は、ユーザーがEdit.aspxページに移動したときに、ARReports行とReportDetailsのパブリックプロパティを編集できるようにすることです。これらはすべてプリミティブタイプです。次に、更新する場合:ReportDetailsオブジェクトをシリアル化してXMLに戻し、テーブルのそのフィールドを更新します。

とにかく、ReportDetailsタイプのARReportクラス(LinqからSQLクラス)にプロパティを作成し、そのクラスのスキャフォールドをEdit.aspxページに含めることができますか?多分このように見えるもの:

public partial class ARReport
{
    private ReportDetails _details;

    public ReportDetails Details
    {
         get
         {
             if (_details == null)
                  _details = ReportDetails.DeSerialize(this.RawXML);
             return _details;
         }
         set
         {
             this.RawXML = ReportDetails.Serialize(_details);
         }
}

public class ReportDetails
{
     public String Owner {get; set;}
     public DateTime LastEdit {get; set;}
     //...etc...

     public static String Serialize(ReportDetails report)
     {
          // serialization code
     }

     public static ReportDetails DeSerialize(String rawXML)
     {
         // deserialization code
     }
}

私が探しているものを達成するためにクラスとプロパティに適用できる属性やトリックのいくつかの組み合わせがあることを望んでいますが、これまでのところ、厳密なグーグル検索は解決策を提示していません。これがあまり混乱していなかったと思います。助けや洞察に感謝します。

4

1 に答える 1

3

これを行うことができます。ReportDetailsのプロパティをL2SデータコンテキストのOUTに保持することを検討してください(1つの列を除いてDBに明示的に存在しないため)。

私が提案するのは、レポートの詳細用のカスタムフィールドテンプレートを作成することです。UIHintAttributeを使用して、編集/詳細ページでそのフィールドテンプレートを適切に参照します。コントロールにデータを入力する前に、レポートの詳細をPOCOに逆シリアル化し、通常どおりコントロールに入力します。

シリアル化に関しては、データコンテキストでSubmitChangesイベントをオーバーライドし、ARReportの更新を確認し、プロパティ値を変更してから、変更を送信します。

public override void SubmitChanges(System.Data.Linq.ConflictMode failureMode)
{
    ChangeSet changeset = GetChangeSet();
    foreach (var change in changeset.Updates.OfType<ARReport>())
    {
        // serialize ReportDetails here before submitting changes. 
    }   
    try
    {
        base.SubmitChanges(ConflictMode.ContinueOnConflict);
    }
    catch (ChangeConflictException cce)
    {
        // handle this
    }
}
于 2012-07-05T23:20:01.793 に答える