Использование FormView с LINQ - PullRequest
0 голосов
/ 20 августа 2009

Я использую элемент управления FormView для редактирования записи, выбранной с помощью LinqDataSource. По сути, разметка для FormView и источника данных выглядит следующим образом:

<asp:FormView ID="RuleInstancePropertiesFormView" runat="server" DataKeyNames="RuleInstanceId"
DataSourceID="RuleInstanceDataSource" DefaultMode="Edit" Visible="false"
CssClass="PropertiesTable">
<EditItemTemplate>
    <asp:Label ID="RuleInstanceId" runat="server" Text='<%# Eval("RuleInstanceId") %>' />

    <telerik:RadTextBox ID="RuleInstanceNameTextBox" 
                        runat="server"
                        Text='<%# Bind("Rule.Name") %>' />

    <telerik:RadTextBox ID="LimitIndexTextBox"
                        runat="server"
                        Text='<%# Bind("LimitIndex") %>' />
</EditItemTemplate>
</asp:FormView>
<asp:LinqDataSource ID="RuleInstanceDataSource" runat="server"
    ContextTypeName="Questionnaire.QuestionnairesDataContext"
    TableName="RuleInstances" EnableUpdate="true">
</asp:LinqDataSource>

Редактируемая мной запись имеет ссылку внешнего ключа на другую таблицу, а именно на таблицу "Правило". В FormView мне нужно отредактировать поля в этой таблице внешнего ключа (у меня есть привязка к полю Rule.Name в приведенном выше коде).

Когда я пытаюсь сохранить свои изменения, локальное поле (LimitIndex) правильно сохраняется в базе данных, а внешнее поле (Rule.Name) - нет. Я немного озадачен этим, так как FormView правильно выбирает текущее значение Rule.Name, но отказывается сохранять его обратно в объект LINQ.

Я надеюсь, что кто-нибудь может помочь, спасибо:)

Ответы [ 2 ]

0 голосов
/ 20 августа 2009

Хорошо, я нашел альтернативное (но не элегантное) решение. Я использую ObjectDataSource вместо LinqDataSource. Затем я определил класс

public class RuleInstanceProjection {
    public RuleInstanceProjection(){}

    // Bind properties from the LINQ object.
    public RuleInstanceProjection(RuleInstance instance) { ... }

    public int RuleInstanceId {get; set;}
    public string Rule_Name {get;set;}
    ...
}

Объект выше принимает RuleInstance в качестве конструктора и обновляет свои собственные свойства всеми значениями, которые мне нужны в FormView. Затем я настраиваю ObjectDataSource для использования другого пользовательского класса, RuleInstanceProjectionDS, в качестве источника данных. Этот класс обрабатывает обновления и вставки моего пользовательского класса RuleInstanceProjection:

public class RuleInstanceProjectionDS
{
    public RuleInstanceProjectionDS() { }

    public RuleInstanceProjection GetRuleInstance(int ruleInstanceId)
    { /* Retrieve the RuleInstance, and instantiate 
         a RuleInstanceProjection object */ }

    public void SaveInstanceProjection(InstanceProjection projection)
    { /* Map fields back to the LINQ objects and submit. */ }
}

Поэтому я могу обрабатывать все отображения в этих двух классах. Теперь мне остается только решить, действительно ли это лучше, чем непосредственное обновление элементов управления графическим интерфейсом ...

Должен сказать, что это не самое элегантное решение, и я надеюсь, что в более поздних версиях ASP.NET будет улучшенная структура привязки данных. Текущий только кажется, что обрабатывает самые тривиальные случаи: (.

0 голосов
/ 20 августа 2009

Вы указываете, какую таблицу использовать в качестве источника данных, используя свойство TableName. Это определяет, какую таблицу Linq2Sql будет обновлять, и поэтому ограничивает обновление только таблицей RulesInstances.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...