ASP.NET MVC Sitemap提供程序 - 动态节点下的非动态节点

时间:2014-09-24 21:29:34

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

我有一个动态节点提供程序,它在下面与我的站点地图配置一起复制。当我转到我的网址/ Account / Edit / 1475时,面包屑会显示" Home>帐户> [帐户名称不正确]>编辑&#34 ;.它显示的帐户名称不同于' accountId'在网址中,1475。我认为这是由于保存的路由参数= 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" }
);

1 个答案:

答案 0 :(得分:0)

使用savedRouteParameters时,使用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操作时,最好始终使用savedRouteParameters。但是,走这条路线时需要注意手动修复标题和节点可见性。

CRUD操作(可能不是Add New)通常不会出现在Menu或SiteMap中,而是通常在页面上生成列表或表格,以便为每条记录动态生成命令。因此,您通常唯一需要担心的是SiteMapPath,为此您可以使用savedRouteParameters。

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