2012-06-11 24 views
2

我正在使用Linq to SQL數據庫上下文處理ASP.NET動態數據網站,並且我有一個問題。在我的其中一張表中,ARReports存在一個包含原始XML數據的列,我可以將其反序列化爲ReportDetails對象以及其他數據,例如EditedBy,ReleaseDate和其他字段。ASP.NET動態數據編輯複雜對象

ReportDetails有幾個公共屬性,我想在我的自定義Edit.aspx頁面上公開。

我的目標是:當用戶導航到Edit.aspx頁,我希望他們能夠編輯ARReports行和ReportDetails的公共屬性,所有這一切都是靈長類動物的類型。然後,當他們更新時:將ReportDetails對象序列化回XML並更新表中的該字段。

無論如何,我可以說,在ReportReport類型的ARReport類(Linq to SQL類)中創建一個Property,並將該類腳手架放到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 
    } 
} 

我希望有我可以申請的類和屬性來實現我所期待的,但到目前爲止,經過嚴格的谷歌搜索的屬性和/或技巧的某種組合沒有提出任何解決方案。我希望這不是太混亂。我感謝任何幫助或見解。

回答

3

這可以做到。考慮將ReportDetails的屬性保留在L2S數據上下文之外(因爲它除了作爲一列以外不顯式存儲在您的數據庫中)。

我會建議爲報告詳細信息構建自定義字段模板。使用UIHintAttribute在編輯/詳細信息頁面上正確引用該字段模板。在填充控件之前,將報表細節反序列化爲POCO並按照慣例填入控件。

就序列化而言,在datacontext中覆蓋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 
    } 
} 
+0

感謝您的建議。我以前從未使用過或查看過UIHintAttribute。我會看看如果我可以在我的項目中使用它,那麼將其標記爲稍後回答,如果它解決了。 – LamdaComplex