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