更新列表的动态数据自定义字段模板

发布于 2024-10-18 17:04:53 字数 3191 浏览 2 评论 0原文

我有一个使用动态数据和 linq to sql 的网站。该网站运行 3 个“子网站”,并有一个具有多对多关系的类别列表。

我的 dbml 中有 3 个表,因此有 3 个对象;网站、类别和 CategoryToWebsites

我想要做的是创建一个字段模板,以便在我的 Category/Edit.aspx 页面上可以编辑类别并指定该类别属于哪个网站。

字段模板是 CategoriesToWebsites_Edit.ascx,其中基本上是一个绑定到网站列表的复选框列表。

代码如下:

public partial class CategoriesToWebsitesEdit : FieldTemplateUserControl
{
    protected override void OnLoad(EventArgs e)
    {
        var dataSource = (LinqDataSource)this.FindDataSourceControl();

        dataSource.Inserting += OnInserting;
        dataSource.Updating += OnUpdating;
    }

    private void OnUpdating(object sender, LinqDataSourceUpdateEventArgs e)
    {
        var newCategory = (Category)e.NewObject;
        var oldCategory = (Category)e.OriginalObject;

        foreach(var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            //check if website category already exists
            var categoryToWebsite = oldCategory.CategoriesToWebsites.FirstOrDefault(x => x.WebsiteId == Convert.ToInt32(listItem.Value));

            //website category exists
            if (categoryToWebsite != null)
            {
                // check if selected for removal, remove
                if (!listItem.Selected)
                {
                    newCategory.CategoriesToWebsites.Remove(categoryToWebsite);
                }
            }

            //we want to insert
            if (listItem.Selected)
            {
                //website category does not exist, add
                if (categoryToWebsite == null)
                {
                    //add selected website if not already exists
                    newCategory.CategoriesToWebsites.Add(new CategoriesToWebsite
                    {
                        WebsiteId = Convert.ToInt32(listItem.Value)
                    });
                }
            }


        }
    }

    private void OnInserting(object sender, LinqDataSourceInsertEventArgs e)
    {
        var category = (Category)e.NewObject;

        foreach(var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            if(!listItem.Selected)
                continue;

            category.CategoriesToWebsites.Add(new CategoriesToWebsite
            {
                WebsiteId = Convert.ToInt32(listItem.Value)
            });
        }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        var websiteRepository = new WebsiteRepository();
        var websites = websiteRepository.GetAll();

        var websiteCategories = (IEnumerable<CategoriesToWebsite>)FieldValue;

        foreach(var website in websites)
        {
            var currentWebsite = website;

            var listItem = new ListItem(website.Name, website.Id.ToString())
            {
                Selected = websiteCategories == null ? false : websiteCategories.Any(w => w.WebsiteId == currentWebsite.Id)
            };

            WebsiteList.Items.Add(listItem);
        }
    }
}

当我转到 Category/Insert.aspx 创建一个新类别时,它很好地运行了 OnInserting 代码并将其保存到数据库中,一切似乎都在这里工作。

在 Category/Edit.aspx 上,它按照我的预期遍历代码,但似乎没有保存任何内容。

我缺少什么? - 我对动态数据字段模板不太熟悉,所以任何指导将不胜感激

I have a website using dynamic data and linq to sql. This website runs 3 'subsites' and has a list of categories with a many to many relationship.

I have 3 tables and hence 3 objects in my dbml; Website, Categories, and CategoriesToWebsites

What I am trying to do is create a field template such that on my Categories/Edit.aspx page I can edit a category and specify which website the category belongs in.

The field template is CategoriesToWebsites_Edit.ascx, which is basically a checkbox list bound to the list of websites.

Code below:

public partial class CategoriesToWebsitesEdit : FieldTemplateUserControl
{
    protected override void OnLoad(EventArgs e)
    {
        var dataSource = (LinqDataSource)this.FindDataSourceControl();

        dataSource.Inserting += OnInserting;
        dataSource.Updating += OnUpdating;
    }

    private void OnUpdating(object sender, LinqDataSourceUpdateEventArgs e)
    {
        var newCategory = (Category)e.NewObject;
        var oldCategory = (Category)e.OriginalObject;

        foreach(var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            //check if website category already exists
            var categoryToWebsite = oldCategory.CategoriesToWebsites.FirstOrDefault(x => x.WebsiteId == Convert.ToInt32(listItem.Value));

            //website category exists
            if (categoryToWebsite != null)
            {
                // check if selected for removal, remove
                if (!listItem.Selected)
                {
                    newCategory.CategoriesToWebsites.Remove(categoryToWebsite);
                }
            }

            //we want to insert
            if (listItem.Selected)
            {
                //website category does not exist, add
                if (categoryToWebsite == null)
                {
                    //add selected website if not already exists
                    newCategory.CategoriesToWebsites.Add(new CategoriesToWebsite
                    {
                        WebsiteId = Convert.ToInt32(listItem.Value)
                    });
                }
            }


        }
    }

    private void OnInserting(object sender, LinqDataSourceInsertEventArgs e)
    {
        var category = (Category)e.NewObject;

        foreach(var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            if(!listItem.Selected)
                continue;

            category.CategoriesToWebsites.Add(new CategoriesToWebsite
            {
                WebsiteId = Convert.ToInt32(listItem.Value)
            });
        }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        var websiteRepository = new WebsiteRepository();
        var websites = websiteRepository.GetAll();

        var websiteCategories = (IEnumerable<CategoriesToWebsite>)FieldValue;

        foreach(var website in websites)
        {
            var currentWebsite = website;

            var listItem = new ListItem(website.Name, website.Id.ToString())
            {
                Selected = websiteCategories == null ? false : websiteCategories.Any(w => w.WebsiteId == currentWebsite.Id)
            };

            WebsiteList.Items.Add(listItem);
        }
    }
}

When I go to Categories/Insert.aspx to create a new category, it runs through the OnInserting code fine and saves it to db just fine, everything seems to be working here.

On Categories/Edit.aspx it goes through the code just as I expect, but does not seem to save anything.

What am I missing? - I'm not too familiar with Dynamic Data Field Templates so any guidance will be much appreciated

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

[浮城] 2024-10-25 17:04:53

显然我的想法有点错误。我只是更新 linq 数据源中的对象,该对象没有被保存。因此,我直接进入存储库:

private void OnUpdating(object sender, LinqDataSourceUpdateEventArgs e)
    {
        var newCategory = (Category)e.NewObject;
        var oldCategory = (Category)e.OriginalObject;

        var repository = new Repository<CategoriesToWebsite>();

        var ctw = repository.GetAll().Where(x => x.CategoryId == newCategory.Id);

        foreach (var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            var current = ctw.FirstOrDefault(x => x.WebsiteId == Convert.ToInt32(listItem.Value));

            //current categoriesToWebsite exists
            if (current != null)
            {
                //if not selected, remove
                if (!listItem.Selected)
                    repository.Delete(current);
            }

            //does not exist
            else
            {
                //if selected, add
                if (listItem.Selected)
                    repository.Save(new CategoriesToWebsite()
                        {
                            CategoryId = newCategory.Id,
                            WebsiteId = Convert.ToInt32(listItem.Value)
                        }
                    );
            }
        }

        UnitOfWork.Current.SubmitChanges();
    }

我不确定这是否是执行此操作的正确方法,因为此处的字段模板直接对数据库进行一些更新。但它有效。

Apparently I was going about this slightly wrong. I was simply updating the object in the linq data source, which wasn't being saved. So instead I go straight to the repository:

private void OnUpdating(object sender, LinqDataSourceUpdateEventArgs e)
    {
        var newCategory = (Category)e.NewObject;
        var oldCategory = (Category)e.OriginalObject;

        var repository = new Repository<CategoriesToWebsite>();

        var ctw = repository.GetAll().Where(x => x.CategoryId == newCategory.Id);

        foreach (var listItem in WebsiteList.Items.Cast<ListItem>())
        {
            var current = ctw.FirstOrDefault(x => x.WebsiteId == Convert.ToInt32(listItem.Value));

            //current categoriesToWebsite exists
            if (current != null)
            {
                //if not selected, remove
                if (!listItem.Selected)
                    repository.Delete(current);
            }

            //does not exist
            else
            {
                //if selected, add
                if (listItem.Selected)
                    repository.Save(new CategoriesToWebsite()
                        {
                            CategoryId = newCategory.Id,
                            WebsiteId = Convert.ToInt32(listItem.Value)
                        }
                    );
            }
        }

        UnitOfWork.Current.SubmitChanges();
    }

I'm not sure if this is the proper way to do this since the field template here is doing some updating directly to the db. But it works.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文