动态数据:如何在编辑页面上过滤外键的下拉列表

时间:2010-03-08 15:23:58

标签: .net linq-to-sql dynamic-data

使用Linq-to-SQL和动态数据。

在动态数据编辑屏幕上,下拉列表列出了外键的可能值。

我需要过滤此下拉列表中列出的值,最好是在linq-to-sql查询中添加where子句。

有什么想法吗?

3 个答案:

答案 0 :(得分:5)

好吧,我找到了一个自定义的地方,虽然我还没有找到覆盖或扩展linq查询来加载数据的方法:

在文件\ DynamicData \ FieldTemplates \ ForeignKey_Edit.ascx.cs中(根据默认位置),在Page_Load方法中进行以下调用:

PopulateListControl(DropDownList1);

这可以完全用您自己的代码替换。 在我的例子中,我首先检查当前表是否实现了我定义的自定义接口。 如果是,请使用它来获取数据以绑定下拉列表,否则将控制权传递给PopulateListControl。

使用Reflector,似乎PopulateListControl最终使用MetaTable.GetQuery()来获取表的默认列表查询。 本来可以很好地反过来..但现在转向其他事情!

答案 1 :(得分:4)

我认为你已经解决了你的问题,但我想注册我的解决方案,以防万一它可以帮助别人!

我按照你的路径,编辑了ForeignKey_Edit.ascx.cs。在PopulateListControl(DropDownList1)行之后,我调用了一个方法RemoveResultsFromOtherUsers()。

以下是方法:

    private void RemoveResultsFromOtherUsers()
    {
        using (var db = new FinWeb3.DynamicData.FinWebDBDataContext())
        {
            var data = db.GetTable(this.Column.Provider.ColumnType);
            var removableItems = new List<ListItem>();

            foreach (var item in data)
            {
                var dbItem = item as IDbEntity;

                if (dbItem.UserName != this.Context.User.Identity.Name)
                {
                    removableItems.Add(
                        DropDownList1.Items.FindByValue(dbItem.Id.ToString()));
                }
            }

            foreach (var item in removableItems)
            {
                DropDownList1.Items.Remove(item);
            }
        }
    }

IDbEntity是我所有linq to sql类实现的接口。此接口具有Id和UserName属性。在这里,我的目的是删除当前经过身份验证的用户未注册的结果。

感谢您的提问和解决方案!

答案 2 :(得分:0)

我将构建一个自定义字段模板,该模板是一个Web用户控件,并使用UIHintAttribute在元数据中引用它。注意:您必须构建标准版本(通常是超链接)和_Edit版本(通常是下拉列表)。