2012-06-11 5 views
2

Я работаю над веб-сайтом Dynamic Data ASP.NET с контекстом базы данных Linq to SQL, и у меня есть вопрос. В одной из моих таблиц ARReports существует столбец с необработанными XML-данными, который можно десериализовать в объект ReportDetails, а также другие данные, такие как EditedBy, ReleaseDate и другие поля.Редактирование динамических данных ASP.NET Сложные объекты

ReportDetails имеет несколько общедоступных свойств, которые я хотел бы открыть на моей странице Edit.aspx.

Моя цель: когда пользователь переходит на страницу Edit.aspx, я хочу, чтобы они могли редактировать строку ARReports и общедоступные свойства ReportDetails, все из которых являются примитивными типами. Затем, когда они обновляются: сериализуйте объект ReportDetails обратно в XML и обновите это поле в таблице.

Есть ли все-таки я могу сказать, создать свойство в классе ARReport (класс Linq to SQL) типа ReportDetails и создать этот класс scaffold на странице 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 
    } 
} 

Я надеюсь, есть некоторая комбинация атрибутов и/или трюков я могу применить к классам и свойствам, чтобы достичь того, что я ищу, но до сих пор, строгий поиск Google не представила никаких решений. Надеюсь, это не слишком смущает. Я ценю любую помощь или прозрение.

ответ

3

Это можно сделать. Рассмотрите возможность сохранения свойств ReportDetails OUT из контекста данных 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

Смежные вопросы