【问题标题】:ASP.NET MVC Sitemap provider - non-dynamic node under dynamic nodeASP.NET MVC Sitemap provider - 动态节点下的非动态节点
【发布时间】:2014-11-19 12:49:13
【问题描述】:

我有一个动态节点提供程序,它与我的站点地图配置一起复制到下面。当我转到我的网址 /Account/Edit/1475 时,面包屑显示“主页 > 帐户 > [不正确的帐户名称] > 编辑”。它显示的帐户名称与 url 中的“accountId”不同,1475。我认为这是由于“preservedRouteParameter=accountId”导致它匹配错误的节点。是这样吗?

我是否需要在我的站点地图中为帐户编辑节点创建另一个 DynamicNodeProvider?我开始走这条路,但我需要为大多数节点创建一个单独的动态节点提供程序,所以我认为我一定做错了什么。我在配置中缺少什么吗?

public class AccountDynamicNodeProvider : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    {
        using (var entities = new Entities())
        {
            foreach (var account in entities.TAccounts)
            {
                var dynamicNode = new DynamicNode("Account_" + account.AccountId, account.AccountName);
                dynamicNode.RouteValues.Add("accountId", account.AccountId);

                yield return dynamicNode;
            }
        }
    }
}

Mvc.sitemap:

<mvcSiteMapNode title="Home" controller="Home" action="Index">
  <mvcSiteMapNode title="Accounts" controller="Account" action="Index">
    <mvcSiteMapNode title="Detail" controller="Account" action="Details" dynamicNodeProvider="my.test.namespace.AccountDynamicNodeProvider, my.assembly">
      <mvcSiteMapNode title="Edit" controller="Account" action="Edit" preservedRouteParameters="accountId" />
      </mvcSiteMapNode>
    </mvcSiteMapNode>
  </mvcSiteMapNode>
</mvcSiteMap>

这是正在使用的路线:

routes.MapRoute(
  name: "Account",
  url: "Account/{action}/{accountId}",
  defaults: new { controller = "Account", action = "Details" }
);

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-4 mvcsitemapprovider


    【解决方案1】:

    使用preservedRouteParameters 时,使用SiteMapTitleAttribute 动态更改标题。

    [SiteMapTitle("MyTitle", Target = AttributeTarget.ParentNode)]
    public ViewResult Edit(int accountId) { 
       var account = _repository.Find(accountId);
    
       // MyTitle is a string property of 
       // the account model object.
       return View(account); 
    }
    

    或者

    [SiteMapTitle("MyTitle", Target = AttributeTarget.ParentNode)]
    public ViewResult Edit(int accountId) { 
       ViewData["MyTitle"] = "This will be the title";
    
       var account = _repository.Find(accountId);
       return View(account); 
    }
    

    一般来说,在配置 CRUD 操作时,最好一直使用preservedRouteParameters。但走这条路需要注意的是,您需要手动修复标题和节点可见性。

    CRUD 操作(可能是添加新的除外)通常不会出现在菜单或站点地图中,而是通常在页面上制作一个列表或表格,以便为每条记录动态生成命令。因此,您通常唯一需要担心的是 SiteMapPath,为此您可以使用preservedRouteParameters。

    查看How to Make MvcSiteMapProvider Remember a User's Position 中的强制匹配演示。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-29
      • 2020-06-24
      • 1970-01-01
      • 1970-01-01
      • 2021-04-17
      • 2011-10-18
      相关资源
      最近更新 更多