【问题标题】:Asp.net Dynamic Data 4 One-to-One ForeignKey.ascx Returning Primary KeyAsp.net 动态数据 4 一对一 ForeignKey.ascx 返回主键
【发布时间】:2011-07-21 19:09:41
【问题描述】:

我有一个使用 LinqToSql (.dbml) 的动态数据 4 站点,用于 2 个具有一对一关系的表。一个表(子表)并不总是有对应于主表的行。

只要是这种情况(没有子表行)而不是空行单元格,DD ForeignKey.ascx 字段模板就会显示一个链接到:

Childtable/Detail.aspx?ChildPkField=PRIMARYTABLEGUID

我找不到阻止这种情况发生的 SQL F 键设置和/或 .dbml 列属性设置的任何组合。到目前为止唯一的解决方案是自定义 ForeignKey.ascx 模板与

 protected string GetDisplayString()
    {
        object value = FieldValue;
        if (value == null)
        {
            //replace this
            //return FormatFieldValue(ForeignKeyColumn.GetForeignKeyString(Row));
            //with this
            return "";
        }
        else
        {
            return FormatFieldValue(ForeignKeyColumn.ParentTable.GetDisplayString(value));
        }
    }

显然不是最佳解决方案。为简化起见,我删除了这两个表的所有自定义元数据以及这些表所涉及的所有其他关系。没有变化。

我确信这很简单,但我已经研究了太久了 - 感谢任何帮助!

这里是当前从 Sql Manager 创建表的脚本:

CREATE TABLE [dbo].[UserProfile](
[UserId] [uniqueidentifier] ROWGUIDCOL  NOT NULL,
[ProfileUserName] [nvarchar](50) NOT NULL,
      CONSTRAINT [PK_Profile] PRIMARY KEY CLUSTERED ([UserId] ASC )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
 GO
 ALTER TABLE [dbo].[UserProfile] ADD  CONSTRAINT [DF_Profile_UserID]  DEFAULT (newid()) FOR [UserId]
GO

CREATE TABLE [dbo].[SubscribedUser](
[subUserId] [uniqueidentifier] NOT NULL,
[subExpireDate] [date] NULL,
     CONSTRAINT [PK_SubscribedUsers] PRIMARY KEY CLUSTERED ([subUserId] ASC) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]) ON [PRIMARY]
 GO
ALTER TABLE [dbo].[SubscribedUser]  WITH CHECK ADD  CONSTRAINT [FK_SubscribedUser_UserProfile] FOREIGN KEY([subUserId]) REFERENCES [dbo].[UserProfile] ([UserId])
GO
ALTER TABLE [dbo].[SubscribedUser] CHECK CONSTRAINT [FK_SubscribedUser_UserProfile]
GO

【问题讨论】:

    标签: asp.net foreign-keys dynamic-data one-to-one


    【解决方案1】:

    实际上,您使用的第一种方法可能是最优化的解决方案,因为已经在服务器端进行了查询以确定列数据是否与外键关系匹配。不再需要查询,只需测试FieldValue == null。此外,模板控件是要编辑的,这就是为什么它们不编译为程序集的原因:

    protected string GetDisplayString()
    {
        object value = FieldValue;
        if (value == null)
        {
            //replace this
            //return FormatFieldValue(ForeignKeyColumn.GetForeignKeyString(Row));
            //with this
            return "";
        }
        else
        {
            return FormatFieldValue(ForeignKeyColumn.ParentTable.GetDisplayString(value));
        }
    }
    

    但是,如果您打算保留源字段的值,请改用此方法:

    protected string GetNavigateUrl()
    {
        //replace this
        //if (!AllowNavigation)
        //with this
        if (!AllowNavigation || FieldValue == null)
        {
            return null;
        }
        if (String.IsNullOrEmpty(NavigateUrl))
        {
            return ForeignKeyPath;
        }
        else
        {
            return BuildForeignKeyPath(NavigateUrl);
        }
    }
    

    在某些条件下(包括默认的css样式),它会生成一个无法点击的看起来像超链接的字段。您可以使用 jQuery 将它们的 outerHTML 设置为它们的 innerHTML(客户端脚本)来过滤和删除那些错误的超链接。当然,还有更优雅的方法,例如在 ForeignKey.ascx 中添加 <asp:label> 并在需要时切换到该控件。

    注意:此方法在使用 ADO.NET 实体数据模型时有效。我没有在 LinqToSqlClasses 上尝试过。

    【讨论】:

    • 谢谢,我刚刚习惯了动态数据的方式来解决问题。修改后的版本很好,看起来你是对的,这和它得到的 DD 结构一样好。其余的,谢谢,是的,我通过更改字段模板以使用标签而不是文字来使用 jQuery 和/或添加字段类。
    • 不,谢谢@Serexx,如果我没有遇到你的问题,我仍然会使用jQuery进行客户端链接验证,这真的很慢,不知道这些信息已经可用。
    【解决方案2】:

    您是否尝试从 linq2sql 类中删除这两个表,然后再次读取它们?也许在此之前再次在模式中重新创建关系?

    F.

    【讨论】:

    • 是的,已经做到了,不过谢谢... l;看起来这是一个 DD 限制
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多