使用带有LINQ的FormView

时间:2009-08-20 11:19:20

标签: asp.net linq linq-to-sql

我使用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 :(得分:0)

您正在使用TableName属性指定要用作数据源的表。这将控制Linq2Sql将更新哪个表,因此将更新限制为RulesInstances表。

答案 1 :(得分:0)

好的,我发现了另一种(但不是优雅的)解决方案。我使用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. */ }
}

因此我可以处理这两个类中的所有映射。现在,我只需要确定这实际上是否比直接更新GUI控件更好......

我必须说它不是最优雅的解决方案,我希望在更高版本的ASP.NET中有更好的数据绑定框架。目前只能处理最微不足道的案件:(。