【问题标题】:Using a FormView with LINQ将 FormView 与 LINQ 一起使用
【发布时间】:2009-08-20 11:19:20
【问题描述】:

我正在使用 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 对象。

希望有人能帮忙,谢谢:)

【问题讨论】:

  • 另外,如果我可以指定要在我的 LINQ 查询中使用的自定义投影对象,那么我可以指定该投影对象和我的 Rule 对象之间的数据绑定(使用外部表引用)。如果 LinqDataSource 还应该支持自动更新,它似乎不允许使用自定义选择查询:(。

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


【解决方案1】:

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

【讨论】:

  • 好吧,我就是这么想的。谢谢!你对我能做什么有什么想法吗?我认为我现在唯一的选择是在代码隐藏中进行所有数据绑定。
  • 是的,很遗憾,您将在后面的代码中执行此操作。
【解决方案2】:

好的,我找到了另一种(但不是优雅的)解决方案。我使用 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 版本中会有更好的数据绑定框架。当前的似乎只处理最琐碎的情况:(。

【讨论】:

    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多