MVCsiteMapProvider вызывает проблему, когда я добавляю дополнительный параметр в свой конструктор службы

Привет, это действительно странно. Я использую MVCsiteMapProvider для создания панели навигации. У меня есть служба под названием Code Serice

public CodeService(
       ICodeRepository codeRepository,
       ICodeStageRepository codeStageRepository,
       ICodeListRepository codeListRepository,
       ICookieService cookieService)
   {
       this.codeRepository = codeRepository;
       this.codeListRepository = codeListRepository;
       this.cookieService = cookieService;
       this.codeStageRepository = codeStageRepository;
   }

если я добавлю дополнительный интерфейс к этому конструктору, мой проект будет построен, но все мое приложение выйдет из строя, когда я запущу его со следующей ошибкой. введите здесь описание изображения

Весь мой макет

@using System.Web.Optimization
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <title>@ViewBag.Title - ReferenceDataManagement </title>
    @Styles.Render("~/content/css/MasterCss")
    @Styles.Render("~/content/jquery.jqGrid/jqgridcss")
    @Styles.Render("~/content/themes/base/jqueryuicss")

</head>
<body>
    <div class="container-fluid">
        <div class="row-fluid"> @RenderPage("~/Views/Shared/_Header.cshtml") </div>
        <div class="row-fluid"> @Html.MvcSiteMap().Menu("BootstrapMenuHelperModel") </div>
        <div class="row-fluid"> @RenderBody() </div>
        <div class="row-fluid"> @RenderPage("~/Views/Shared/_Footer.cshtml") </div>
    </div>
    @Scripts.Render("~/Scripts/MasterScripts")    
    @RenderSection("scriptholder", false)
</body>
</html>

И помощник меню Bootstrap выглядит следующим образом

@model MenuHelperModel

@helper  TopMenu(List<SiteMapNodeModel> nodeList)
{
@:
<div class="navbar">
    <div class="navbar-inner">
        <div class="container">

            <a class="btn btn-navbar" data-toggle="collapse" data-target=".nav-collapse">
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
                <span class="icon-bar"></span>
            </a>
            <a class="brand hidden-desktop" href="#">RDM</a>

            <div class="nav-collapse collapse">
                <ul class="nav">
                    @foreach (var node in nodeList)
                    {
                        var current = String.Empty;

                        var url = node.IsClickable ? node.Url : "#";

                        if (node.IsCurrentNode)
                        {
                            current = "active";
                        }

                        if (!node.Children.Any())
                        {
                            @:<li class="@current"><a href="@url">@node.Title</a></li>
                        }
                        else
                        {
                            foreach (var child in node.Children)
                            {
                                if (child.IsCurrentNode)
                                {
                                    current = "active";  
                                }
                            }

                            @:<li class="dropdown @current"><a class="dropdown-toggle" data-toggle="dropdown" href="@url">@node.Title <b class="caret"></b></a>@DropDownMenu(node.Children)</li>
                        }

                        if (node != nodeList.Last())
                        {
                            @:<li class="divider-vertical"></li>
                        }
                    }
                </ul>

                <ul class="nav pull-right">
                    <li class="divider">
                        @Html.ActionLink("Sign Out", "SignOutConfirmation", "Account") 
                    </li>
                </ul> 
            </div>
        </div>
    </div>
</div>
}

@helper DropDownMenu(SiteMapNodeModelList nodeList)
{
  <ul class="dropdown-menu">
  @foreach (var node in nodeList)
  {
    if (node.Title == "Separator")
    {
      @:<li class="divider"></li>
      continue;
    }

    var url = node.IsClickable ? node.Url : "#";

    if (!node.Children.Any())
    {
      @:<li><a href="@url">@node.Title</a></li>
    }
    else
    {
       @:<li class="dropdown-submenu"><a href="@url">@node.Title</a>@DropDownMenu(node.Children)</li>
    }
  }
  </ul>
}

   @TopMenu(Model.Nodes)

Я не вижу, как эти фрагменты кода связаны друг с другом или где может возникнуть конфликт. Кто-нибудь сталкивался с подобной проблемой?

ИЗМЕНИТЬ:

<?xml version="1.0" encoding="utf-8" ?>
<mvcSiteMap xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0"
        xsi:schemaLocation="http://mvcsitemap.codeplex.com/schemas/MvcSiteMap-File-4.0 MvcSiteMapSchema.xsd">

  <mvcSiteMapNode title="Home" controller="Home" action="Index">
     <mvcSiteMapNode title="About" controller="Home" action="About"/>
     <mvcSiteMapNode title="Contact" controller="Home" action="Contact"/>
     <mvcSiteMapNode title="Context" controller="Context" action="Index"/>
     <mvcSiteMapNode title="Code List" controller="CodeList" action="Index" roles="Administrator" />
     <mvcSiteMapNode title="Code" controller="Code" action="Index" roles="Administrator" />

   <mvcSiteMapNode title="Users" controller ="" clickable="false" roles="Administrator, ContextOwner">
      <mvcSiteMapNode title="Application Users" controller="User" action="Index" roles="ContextOwner"/>
      <mvcSiteMapNode title="Maintain Context Users" controller="ContextUser" action="Index"/>
   </mvcSiteMapNode>

   <mvcSiteMapNode title="Admin" clickable="false" controller="UploadXmlSchema" roles="Administrator">
      <mvcSiteMapNode title="XML Schema" controller="UploadXmlSchema" action="Index" />
    </mvcSiteMapNode>

    <mvcSiteMapNode title="Approvals" controller="Approval" action="Index" />
  </mvcSiteMapNode>
</mvcSiteMap>

person Jeff Finn    schedule 11.12.2013    source источник


Ответы (1)


Если не ошибаюсь, это баг, который был исправлен в v4.4.6. Проблема возникает из-за того, что для свойства контроллера устанавливается значение null, а затем считывается свойство (это то, что внутренне будет делать помощник меню HTML).

Если это так, вы можете либо обновиться до версии 4.4.6, чтобы устранить проблему, либо просто убедиться, что для вашего свойства Controller (или ключа «controller» свойства RouteValues) всегда задана пустая строка, а не нуль.

node.Controller = theValue ?? string.Empty;
person NightOwl888    schedule 11.12.2013
comment
Привет, я обновился до 4.4.6, и у меня все еще есть та же проблема, не могли бы вы предоставить более подробную информацию о втором решении. Я использую MVC.sitemap для создания панели навигации mu, я прикрепил код выше - person Jeff Finn; 12.12.2013