Создание / удаление узла карты сайта в ActionResult - поставщик SiteMap ASP.NET MVC - PullRequest
0 голосов
/ 23 августа 2010

Я использую ASP.NET MVC SiteMap провайдера для создания динамических узлов карты сайта. Он работает при первой загрузке приложения, но я хочу добавить / удалить узлы, когда выполняется ActionResult (чтобы добавить / удалить запись из базы данных). Мой web.sitemap выглядит следующим образом (вынули родительский узел и других братьев и сестер)

<mvcSiteMapNode dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DatesDynamicNodeProvider, MyWebSite">
    <mvcSiteMapNode action="Details" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DetailsDynamicNodeProvider, MyWebSite" />
    <mvcSiteMapNode action="Edit" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.EditDynamicNodeProvider, MyWebSite" />
    <mvcSiteMapNode action="Delete" dynamicNodeProvider="MyWebSite.DynamicNodeProvider.DeleteDynamicNodeProvider, MyWebSite" />
</mvcSiteMapNode>

Даты генерируются динамически:

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        DBDataContext db = new DBDataContext();

        var records = db.records.ToList();
        if (records != null)
        {
            DateTime created;
            foreach (var record in records)
            {
                if (record.DateCreated.HasValue)
                {
                    created = record.DateCreated.Value;
                    DynamicNode node = CreateNode(created);
                    yield return node;
                }

            }
        }
    }

    public static DynamicNode CreateNode(DateTime date)
    {
        DynamicNode node = new DynamicNode("record_" + date.ToString("yyyy-M"), date.ToString("MMMM yyyy"));
        node.Action = date.ToString("yyyy-M");
        node.ParentKey = "records";
        return node;
    }

А затем добавьте узлы под эти сгенерированные узлы:

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection()
    {
        DBDataContext db = new DBDataContext();

        var records = db.records.ToList();
        if (records != null)
        {
            // Create a node for each record
            foreach (var record in records)
            {
                if (record.DateCreated.HasValue)
                {
                    DynamicNode node = CreateNode(record);

                    yield return node;
                }
            }
        }
    }

    public static DynamicNode CreateNode(Record record)
    {
        DateTime created = record.DateCreated.Value;
        DynamicNode node = new DynamicNode("record_edit_" + record.ID, string.Format("{0:dd MMM yyyy}: {1} (Edit)", created, record.Title));
        node.RouteValues["id"] = record.ID;
        node.ParentKey = "record_" + created.ToString("yyyy-M");

        return node;
    }

Однако я дошел до того, что создал эти узлы в ActionResult, но застрял на этом этапе. Я могу взять узел:

var node = ((MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider).FindSiteMapNodeFromKey("record_edit_" + record.ID);

Но тогда я хочу проверить, является ли узел нулевым, и если нет, создать новый (и родительский узел, если он не существует). Первое, что я попробовал, не работает, так как не уверен, что вы можете добавить DynamicNode на карту сайта (так как я не могу привести DynamicNode к SiteMapNode)

    if (node == null)
    {
        node = DynamicNodeProvider.EditDynamicNodeProvider.CreateNode(record) as SiteMapNode;
        var parent = ((MvcSiteMapProvider.DefaultSiteMapProvider)SiteMap.Provider).FindSiteMapNodeFromKey("record_" + record.DateCreated.Value.ToString("yyyy-M"));
        if (parent == null)
        {
            parent = DynamicNodeProvider.DatesDynamicNodeProvider.CreateNode(record.DateCreated.Value) as SiteMapNode;
            parent.Action = record.DateCreated.Value.ToString("yyyy-M");
            parent.ParentKey = "records";
        }
        node.ParentKey = parent.ParentKey;
    }

Конечно, это не работает из-за вышеупомянутой проблемы.

Это только для страницы редактирования для каждой записи, я также хочу изменить заголовок (если заголовок изменен) или удалить из карты сайта, если необходимо.

Есть идеи?

1 Ответ

0 голосов
/ 26 августа 2010

Попробуйте установить зависимость кэша от провайдеров динамических узлов и попросите их запустить обновление карты сайта при необходимости (например, при добавлении записи).

...