У меня есть веб-сайт, использующий динамические данные и linq to sql. Этот веб-сайт работает с 3 «дочерними сайтами» и содержит список категорий, имеющих отношение «многие ко многим».
У меня есть 3 таблицы и, следовательно, 3 объекта в моем dbml; Веб-сайт, категории и категорииТу-сайты
Я пытаюсь создать шаблон поля так, чтобы на моей странице Categories / 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);
}
}
}
Когда я захожу в Categories / Insert.aspx, чтобы создать новую категорию, она проходит через код OnInserting и сохраняет его в db просто отлично, здесь все работает.
На Categories / Edit.aspx он проходит код, как я и ожидал, но, похоже, ничего не сохраняет.
Чего мне не хватает? - Я не слишком знаком с динамическими шаблонами полей данных, поэтому любые рекомендации будут высоко оценены