数据库中的动态站点地图不显示节点

2024-02-06

我已经实现了这个https://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider https://github.com/maartenba/MvcSiteMapProvider/wiki/Defining-sitemap-nodes-using-IDynamicNodeProvider

Edit: 这是我的课

public class MyDynamicNodeProvider
: DynamicNodeProviderBase
{

    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)

    { 
        webdata storeDB = new webdata();

        var returnValue = new List<DynamicNode>();


        foreach (var article in storeDB.SiteContents) 
        {


            DynamicNode enode = new DynamicNode();
            enode.Title = article.ArticleTitle;
            enode.ParentKey = "ArticleID"; 
            enode.Url = "ArticleDetails/" + article.ArticleID + "/" + article.ArticleAlias;
            //Specify Controller and Action name
            enode.Controller = "SiteContents";
            enode.Action = "ArticleDetails";
            enode.RouteValues.Add("id", article.ArticleID);
            returnValue.Add(enode);

            yield return enode;
        }


    }
}

Edit:这是我的站点地图文件

 <mvcSiteMapNode title="Home" controller="Home" action="Index">
 <mvcSiteMapNode title="About Us" controller="Menu" action="AboutUs">
 <mvcSiteMapNode title="Profile" controller="Menu"   action="Profile"/>
 <mvcSiteMapNode title="History" controller="Menu" action="History"/>
 </mvcSiteMapNode>
 <mvcSiteMapNode title="Article" controller="SiteContents"  action="ArticleDetails" key="ArticleID"> 
 <mvcSiteMapNode title="Details"  dynamicNodeProvider="Myproject.Models.MyDynamicNodeProvider, Myproject"  />
 </mvcSiteMapNode>

Edit:我拥有的第二个控制器(SiteContentsController)

  public ActionResult ArticleDetails(int? id, string slug)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        SiteContents siteContents = db.SiteContents.Find(id);
        if (siteContents == null)
        {
            return HttpNotFound();
        }
        if (string.IsNullOrWhiteSpace(slug))
        {

            var alias = db.SiteContents.First(p => p.ArticleID == id).ArticleAlias;


            return RedirectToAction("ArticleDetails", new { id = id, slug = alias });
        }

        return View(siteContents);
      }

我想要的网址(可以工作,但没有带来站点地图 是http://localhost:xxxx/ArticleDetails/1/Quality_Policy

我在布局页面上调用站点地图

@Html.MvcSiteMap().SiteMapPath()

Edit:我的路线.config

 public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(name: "Articles", url: "ArticleDetails/{id}/{slug}", defaults: new { controller = "SiteContents", action = "ArticleDetails", id = UrlParameter.Optional, slug = UrlParameter.Optional });

        routes.MapRoute(name: "Default", url: "{controller}/{action}/{id}", defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional});


    }

我还有一些工作正常的静态节点。问题是,在动态页面中没有返回任何内容,并且我没有收到任何错误消息 谢谢


它不起作用的原因是您没有考虑所有路由值,即您有一个名为slug您需要配置节点来匹配。

如果您希望节点匹配而不管 的值如何slug(即使它是空白的),你应该使用PreservedRouteParameters来匹配它。否则,您应该将其添加到RouteValues并且该节点只会匹配one您为其配置的值(如果需要,您可以添加其他节点以匹配其他值)。我正在展示PreservedRouteParameters接近这里。

此外,您还可以通过配置来有效禁用 MVC 支持Url动态节点上的属性。如果您需要使用非 MVC 页面或外部 URL,此属性非常有用,但不建议用于 MVC。

MvcSiteMapProvider直接取决于 MVC 路由配置。您可以在此处配置 URL,使其呈现您想要的外观。对于您期望的 URL (http://localhost:xxxx/ArticleDetails/1/Quality_Policy)要工作,您需要一个相应的路线来匹配此模式,如下所示。

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        // Route to match the URL /ArticleDetails/1/Quality_Policy
        routes.MapRoute(
            name: "ArticleDetails",
            url: "ArticleDetails/{id}/{slug}",
            defaults: new { controller = "SiteContents", action = "ArticleDetails", slug = UrlParameter.Optional }
        );

        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );
    }
}

您遇到的另一个问题是要将动态节点附加到的节点。当前配置节点的方式转到ArticleDetails行动。我不知道你想在这里做什么。通常,您会显示所有文章页面的列表(索引),然后当用户单击文章时,您会显示它。这是一个例子。

// NOTE: Normally, you would put all of your Article stuff
// into an ArticleController
public class SiteContentsController
{
    // NOTE: Normally, this would be named ArticleController.Index()
    public ActionResult ArticleIndex()
    {
        // NOTE: You may want to use a view model here
        // rather than using the SiteContents directly.
        var siteContents = db.SiteContents.ToList();
        return View(siteContents);
    }

    // NOTE: Normally, this would be named ArticleController.Details()
    public ActionResult ArticleDetails(int? id, string slug)
    {
        if (id == null)
        {
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }
        SiteContents siteContents = db.SiteContents.Find(id);
        if (siteContents == null)
        {
            return HttpNotFound();
        }
        if (string.IsNullOrWhiteSpace(slug))
        {

            var alias = db.SiteContents.First(p => p.ArticleID == id).ArticleAlias;


            return RedirectToAction("ArticleDetails", new { id = id, slug = alias });
        }

        return View(siteContents);
    }
}

和你的Mvc.sitemap文件看起来更像这样(文章位于主页下方)。我相信这是您的主要问题 - 您的 XML 文件中只能有一个根节点(通常是网站的主页)。

<mvcSiteMapNode title="Home" controller="Home" action="Index">
    <mvcSiteMapNode title="About Us" controller="Menu" action="AboutUs">
    <mvcSiteMapNode title="Profile" controller="Menu"   action="Profile">
        <mvcSiteMapNode title="Quality Policy" controller="Menu" action="Policy"/>
    </mvcSiteMapNode>
    <mvcSiteMapNode title="History" controller="Menu" action="History"/>
    <mvcSiteMapNode title="Articles" controller="SiteContents"  action="ArticleIndex" key="Articles"> 
        <mvcSiteMapNode title="Details" dynamicNodeProvider="Myproject.Models.MyDynamicNodeProvider, Myproject"  />
    </mvcSiteMapNode>
</mvcSiteMapNode>

最后我们得到了修正后的DynamicNodeProvider.

public class MyDynamicNodeProvider
    : DynamicNodeProviderBase
{
    public override IEnumerable<DynamicNode> GetDynamicNodeCollection(ISiteMapNode node)
    { 
        webdata storeDB = new webdata();

        foreach (var article in storeDB.SiteContents) 
        {
            DynamicNode enode = new DynamicNode();
            enode.Title = article.ArticleTitle;
            enode.ParentKey = "Articles";

            // Don't use the Url property unless you have a 
            // non-MVC page/external URL
            //enode.Url = "ArticleDetails/" + article.ArticleID + "/" + article.ArticleAlias;

            // Specify Controller, Action name, and id.
            // These values all must match the request in order 
            // for the node to be considered the "current" node
            enode.Controller = "SiteContents";
            enode.Action = "ArticleDetails";
            enode.RouteValues.Add("id", article.ArticleID);

            // Match the slug (we don't really care what its value is here)
            enode.PreservedRouteParameters.Add("slug");

            yield return enode;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据库中的动态站点地图不显示节点 的相关文章

  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 如何使用 Error.cshtml 视图中的过滤器放入 ViewBag 的数据?

    我有一个操作过滤器 负责将一些通用信息放入 ViewBag 中 供共享 Layout cshtml 文件中的所有视图使用 public class ProductInfoFilterAttribute ActionFilterAttribu
  • 禁用视图中所需的验证特定字段 ASP.NET MVC 4

    如果有人能给我一些提示 我将不胜感激 我搜索了一段时间 我什至找到了一个帖子 我认为它可以解决我的问题 但它没有 在某些情况下禁用必需的验证属性 https stackoverflow com questions 5367287 disab
  • 在 ASP.NET Core 2.0 Web Api 中返回“原始”json

    AFAIK 在 ASP NET Core Web Api 中返回数据的标准方法是使用IActionResult并提供例如一个OkObject结果 这对于对象来说效果很好 但是如果我以某种方式获得了一个 JSON 字符串 并且我只想将该 JS
  • 运行更新数据库时出错

    我在运行时遇到以下错误Update Database Verbose 使用启动项目 WebApplication 使用 NuGet 项目 Web应用程序 指定 Verbose 标志来查看 SQL 应用于目标数据库的语句 目标数据库是 星冰乐
  • Azure 云服务在应用程序池回收后停止运行

    我部署了一个 Azure 云服务 WebRole WebAPI 只有一个实例 我注意到 如果我等待一些空闲时间 没有 HTTP 请求 那么稍后服务就会死掉 并且对它的每个请求都会导致以下响应 Message An error has occ
  • 元数据集合中不存在标识为“ ”的成员。\r\n参数名称: Identity

    我在尝试调试时稍微简化了代码 HttpPost public ActionResult Register User model DateTime bla new DateTime 2012 12 12 try User user new U
  • Html Helper“操作”未定义,Asp.NET Core 2.2

    我是 ASP NET Core MVC 的新手 我会在这个问题前说我已经阅读了其他类似的问题 但它们与我遇到的问题并不完全相同 我正在尝试实现动态左侧导航 其中每个按钮都是从我的数据库加载的 当我打电话时 Html Action NavMe
  • 单击关闭按钮后不显示 Google 一键登录 UI

    我正在尝试按照本指南使新的谷歌一键登录工作 https developers google com identity one tap web https developers google com identity one tap web
  • 64 位 ASP.NET MVC 应用程序无法运行

    首先 我之前曾设法让我的一个 64 位测试 Web 应用程序在这台机器上运行 当我为这个项目制作原型时 我已经在 32 位环境中工作了几周 意识到我需要将应用程序切换到 64 位 当我这样做 在项目中将目标平台设置为 x64 并重新部署时
  • 重命名 ASP.NET MVC 项目时出错

    我复制了以前的项目并将其重命名 一旦我成功重命名了所有名称空间并且它构建正确 当我运行该应用程序时 出现以下错误 The following errors occurred while attempting to load the app
  • ASP.NET MVC 开源真实世界应用程序 [已关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 每当我开始学习新技术或语言时 我倾向于查看一些 现实世界 应用程序的源代码 我发现它们对于理解常见的
  • MVC3 Controller 文件夹不会出现在 URL 中

    这只是一个例子 我不知道如何让它工作 在我的 MVC3 控制器文件夹中 如果我添加一个名为 Admin 的新文件夹 并添加一个带有操作 Index 的控制器 News 则当您尝试打开该 url 404 时 您会收到服务器错误 http ur
  • 更新我的模型然后重新评估 IsValid?

    我将一些值传递给我的控制器操作 一切都绑定得很好 根据设计 表单 POST 中会缺少两个属性 然后我设置了缺失的值 但随后我想验证模型 但它仍然显示为 false 因为 ModelState 似乎没有跟上我的更改 HttpPost Auth
  • 实体类型处于“影子状态”意味着什么?

    在我的 ASP NET Core 1 0 MVC6 EF7 Web 应用程序中 我添加了一个迁移 该迁移添加了新的相关表 和相应的模型 我有以下模型快照 DbContext typeof ApplicationDbContext parti
  • ASP.NET Identity:使用角色授权属性在 Azure 上不起作用

    我刚刚在 Azure 上发布了带有 Identity 和 OWIN 授权的新 ASP NET MVC 网站 前端工作得很好 但后端有问题 我在管理控制器中使用 Authorize 属性来检查用户是否具有访问它所需的角色 如下所示 Autho
  • 我可以在 Windows 服务中托管(自托管)WCF 服务并通过 http 公开它吗?

    我是 WCF 新手 这可能吗 如果通过外部 Web 应用程序使用它 最好使用 IIS 和 http 即由 ASP NET MVC 应用程序托管的服务 吗 是的 您可以在 Windows 服务中托管 WCF 服务 http msdn micr
  • asp.net mvc jquery 下拉验证

    我如何使用不显眼的 javascript 验证下拉列表 作为所需验证器的验证文本框 但它不适用于下拉列表 需要更改不显眼的 js 文件吗 或者还有其他选项来验证下拉列表吗 我想在我的 javascript 中检查 form validate
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • ASP.NET Core 中间件与过滤器

    在阅读了 ASP NET Core 中间件之后 我对何时应该使用过滤器以及何时应该使用中间件感到困惑 因为它们似乎实现了相同的目标 什么时候应该使用中间件而不是过滤器 9频道有一个关于此的视频 ASP NET 怪物 91 中间件与过滤器 h

随机推荐