ASP.NET动态数据编辑复杂对象

时间:2012-06-11 23:53:34

标签: c# asp.net .net asp.net-dynamic-data complextype

我正在使用Linq to SQL数据库上下文的ASP.NET动态数据网站,我有一个问题。在我的一个表中,ARReports存在一个包含原始XML数据的列,我可以将其反序列化为ReportDetails对象,以及其他数据,如EditedBy,ReleaseDate和其他字段。

ReportDetails有几个公共属性,我想在我的自定义Edit.aspx页面上公开。

我的目标是:当用户导航到Edit.aspx页面时,我希望他们能够编辑ARReports行和ReportDetails的公共属性,所有这些都是主要类型。然后,当他们更新时:将ReportDetails对象序列化为XML并更新表中的该字段。

无论如何我可以说,在ReportDetails类型的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
     }
}

我希望有一些属性和/或技巧的组合我可以应用于类和属性来实现我正在寻找的东西,但到目前为止,一个严格的谷歌搜索没有提出任何解决方案。我希望这不会太混乱。我感谢任何帮助或见解。

1 个答案:

答案 0 :(得分:3)

这可以做到。考虑保留L2S数据上下文的ReportDetails OUT的属性(因为除了作为一列之外,它没有显式在您的数据库中)。

我建议为报告详细信息构建自定义字段模板。使用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
    }
}