2014-11-02 3 views
0

mvc3에서 mvc5로 업그레이드 한 후 MvcSiteMapProvider에서 문제가 발생했습니다. 다음 간단한 web.config, @ Html.MvcSiteMap()을 사용하여 간단한 테스트 뷰를 테스트했습니다. SiteMapPath()가 정상적으로 작동했습니다.ASP.NET MVC 5 '~/Views/Shared/DisplayTemplates/SiteMapPathHelperModel.cshtml'의보기가 WebViewPage 또는 WebViewPage에서 파생되어야합니다. <TModel>

<?xml version="1.0" encoding="utf-8"?> 
<!-- 
    For more information on how to configure your ASP.NET application, please visit 
    http://go.microsoft.com/fwlink/?LinkId=301880 
    --> 
<configuration> 
    <appSettings> 
    <add key="webpages:Version" value="3.0.0.0" /> 
    <add key="webpages:Enabled" value="false" /> 
    <add key="PreserveLoginUrl" value="true" /> 
    <add key="ClientValidationEnabled" value="true" /> 
    <add key="UnobtrusiveJavaScriptEnabled" value="true" /> 

    <add key="MvcSiteMapProvider_UseExternalDIContainer" value="false" /> 
    <add key="MvcSiteMapProvider_IncludeAssembliesForScan" value="XXX.WebMVC" /> 
    <add key="MvcSiteMapProvider_ScanAssembliesForSiteMapNodes" value="true" /> 
    <add key="MvcSiteMapProvider_EnableSiteMapFile" value="false" /> 
    <add key="MvcSiteMapProvider_IncludeRootNodeFromSiteMapFile" value="true" /> 

    </appSettings> 
    <system.web> 
    <compilation debug="true" targetFramework="4.5" /> 
    <httpRuntime targetFramework="4.5" /> 
    <pages> 
     <namespaces> 
     <add namespace="MvcSiteMapProvider.Web.Html" /> 
     <add namespace="MvcSiteMapProvider.Web.Html.Models" /> 
     </namespaces> 
    </pages> 
    </system.web> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Helpers" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.WebPages" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="1.0.0.0-3.0.0.0" newVersion="3.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> 
     <bindingRedirect oldVersion="0.0.0.0-5.1.0.0" newVersion="5.1.0.0" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 

</configuration> 

그러나 내 web.config는 훨씬 더 복잡합니다. 모든 해당 부분을 업데이트했지만 여전히 스택 추적 오류가 발생했습니다 :

'~/Views/Shared/DisplayTemplates/SiteMapPathHelperModel.cshtml'의보기는 WebViewPage 또는 WebViewPage에서 파생되어야합니다. .

[InvalidOperationException: The view at '~/Views/Shared/DisplayTemplates/SiteMapPathHelperModel.cshtml' must derive from WebViewPage, or WebViewPage<TModel>.] 
    System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +401 
    System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107 
    System.Web.Mvc.Html.TemplateHelpers.ExecuteTemplate(HtmlHelper html, ViewDataDictionary viewData, String templateName, DataBoundControlMode mode, GetViewNamesDelegate getViewNames, GetDefaultActionsDelegate getDefaultActions) +544 
    System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData, ExecuteTemplateDelegate executeTemplate) +1089 
    System.Web.Mvc.Html.TemplateHelpers.TemplateHelper(HtmlHelper html, ModelMetadata metadata, String htmlFieldName, String templateName, DataBoundControlMode mode, Object additionalViewData) +66 
    System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData, TemplateHelperDelegate templateHelper) +119 
    System.Web.Mvc.Html.TemplateHelpers.TemplateFor(HtmlHelper`1 html, Expression`1 expression, String templateName, String htmlFieldName, DataBoundControlMode mode, Object additionalViewData) +104 
    MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper helper, String templateName, ISiteMapNode startingNode, SourceMetadataDictionary sourceMetadata) +232 
    MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper helper, String templateName, String startingNodeKey, SourceMetadataDictionary sourceMetadata) +70 
    MvcSiteMapProvider.Web.Html.SiteMapPathHelper.SiteMapPath(MvcSiteMapHtmlHelper helper) +45 
    ASP._Page_Views_Home_Test_cshtml.Execute() in c:\Projects\Drive\drive\Src\Web\Views\Home\Test.cshtml:9 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy() +198 
    System.Web.Mvc.WebViewPage.ExecutePageHierarchy() +104 
    System.Web.WebPages.StartPage.RunPage() +17 
    System.Web.WebPages.StartPage.ExecutePageHierarchy() +64 
    System.Web.WebPages.WebPageBase.ExecutePageHierarchy(WebPageContext pageContext, TextWriter writer, WebPageRenderingBase startPage) +78 
    System.Web.Mvc.RazorView.RenderView(ViewContext viewContext, TextWriter writer, Object instance) +256 
    System.Web.Mvc.BuildManagerCompiledView.Render(ViewContext viewContext, TextWriter writer) +107 
    System.Web.Mvc.ViewResultBase.ExecuteResult(ControllerContext context) +291 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResult(ControllerContext controllerContext, ActionResult actionResult) +13 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +56 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultFilterRecursive(IList`1 filters, Int32 filterIndex, ResultExecutingContext preContext, ControllerContext controllerContext, ActionResult actionResult) +420 
    System.Web.Mvc.ControllerActionInvoker.InvokeActionResultWithFilters(ControllerContext controllerContext, IList`1 filters, ActionResult actionResult) +52 
    System.Web.Mvc.Async.<>c__DisplayClass2b.<BeginInvokeAction>b__1c() +173 
    System.Web.Mvc.Async.<>c__DisplayClass21.<BeginInvokeAction>b__1e(IAsyncResult asyncResult) +100 
    System.Web.Mvc.Async.WrappedAsyncResult`1.CallEndDelegate(IAsyncResult asyncResult) +10 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +49 
    System.Web.Mvc.Async.AsyncControllerActionInvoker.EndInvokeAction(IAsyncResult asyncResult) +27 
    System.Web.Mvc.Controller.<BeginExecuteCore>b__1d(IAsyncResult asyncResult, ExecuteCoreState innerState) +13 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54 
    System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) +39 
    System.Web.Mvc.Controller.<BeginExecute>b__15(IAsyncResult asyncResult, Controller controller) +12 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +28 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54 
    System.Web.Mvc.Controller.EndExecute(IAsyncResult asyncResult) +29 
    System.Web.Mvc.Controller.System.Web.Mvc.Async.IAsyncController.EndExecute(IAsyncResult asyncResult) +10 
    System.Web.Mvc.MvcHandler.<BeginProcessRequest>b__5(IAsyncResult asyncResult, ProcessRequestState innerState) +21 
    System.Web.Mvc.Async.WrappedAsyncVoid`1.CallEndDelegate(IAsyncResult asyncResult) +36 
    System.Web.Mvc.Async.WrappedAsyncResultBase`1.End() +54 
    System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +31 
    System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9 
    System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +9657896 
    System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155 

나는) (시계의 창 @ Html.MvcSiteMap을에서()에 SiteMapPath @ Html.MvcSiteMap()에서 브레이크 포인트를 넣어 예외

@Html.MvcSiteMap() 'System.Web.Mvc.HtmlHelper<object>' does not contain a definition for 'MvcSiteMap' and the best extension method overload 'MvcSiteMapProvider.Web.Html.HtmlHelperExtensions.MvcSiteMap(System.Web.Mvc.HtmlHelper)' has some invalid arguments 

내 조회수 /의 Web.config

을 제기 :

<?xml version="1.0"?> 
<configuration> 
    <configSections> 
    <sectionGroup name="system.web.webPages.razor" type="System.Web.WebPages.Razor.Configuration.RazorWebSectionGroup, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"> 
     <section name="host" type="System.Web.WebPages.Razor.Configuration.HostSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
     <section name="pages" type="System.Web.WebPages.Razor.Configuration.RazorPagesSection, System.Web.WebPages.Razor, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" requirePermission="false" /> 
    </sectionGroup> 
    </configSections> 
    <system.web.webPages.razor> 
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> 
    <pages pageBaseType="System.Web.Mvc.WebViewPage"> 
     <namespaces> 
     <add namespace="System.Web.Mvc" /> 
     <add namespace="System.Web.Mvc.Ajax" /> 
     <add namespace="System.Web.Mvc.Html" /> 
     <add namespace="System.Web.Routing" /> 
     <add namespace="MvcSiteMapProvider.Web.Html" /> 
     <add namespace="MvcSiteMapProvider.Web.Html.Models" /> 
     </namespaces> 
    </pages> 
    </system.web.webPages.razor> 
    <appSettings> 
    <add key="webpages:Enabled" value="false" /> 
    </appSettings> 
    <system.webServer> 
    <handlers> 
     <remove name="BlockViewHandler" /> 
     <add name="BlockViewHandler" path="*" verb="*" preCondition="integratedMode" type="System.Web.HttpNotFoundHandler" /> 
    </handlers> 
    </system.webServer> 
</configuration> 

오류의 원인이 될 수있는 가장 큰 부분은 무엇입니까?

답변

0

MVC 버전간에 직접 업그레이드 경로가 없으므로 MVC 3 NuGet 패키지를 제거하고 MVC 5 NuGet 패키지를 설치해야합니다. MVC의 각 버전마다 별도의 MvcSiteMapProvider DLL이 있으므로 어셈블리 바인딩 리디렉션으로이 문제가 해결되지 않습니다.

  1. 아무 것도 잃지 않도록 솔루션을 백업하십시오.
  2. 패키지 관리자 콘솔에서 PM> Uninstall-Package MvcSiteMapProvider.MVC3을 실행하십시오.
  3. MVC 5.x가 packages.config 파일에 포함되어 있는지 확인하십시오. 그렇지 않은 경우 PM> Install-Package Microsoft.AspNet.Mvc을 다시 설치하십시오.
  4. 패키지 관리자 콘솔에서 PM> Install-Package MvcSiteMapProvider.MVC5을 실행하십시오. 파일을 덮어 쓸지 여부를 묻는 메시지가 표시되면 "아니요"라고 대답합니다.이 파일은 사용자 지정이있는 파일입니다. 설치하기 전에

MvcSiteMapProvider.Web 패키지는 프로젝트가 MVC 5 감지하고 당신이 MVC (5)를 확인해야합니다 그래서, MVC 5에서 작동하도록 올바른 설정으로 Web.Config 파일을 업데이트합니다 프로젝트에 설치 MvcSiteMapProvider.

완료되면 packages.config 파일에 올바른 버전이 설치되어 있는지 다시 확인하십시오. 귀하의 버전과 targetFramework는 이것과 다를 수 있지만 MVC 5 패키지가 있어야합니다.

<package id="MvcSiteMapProvider.MVC5" version="4.6.17" targetFramework="net451" /> 
<package id="MvcSiteMapProvider.MVC5.Core" version="4.6.17" targetFramework="net451" /> 
<package id="MvcSiteMapProvider.Web" version="4.6.1" targetFramework="net451" /> 

어떤 문제가있는 경우, 또는 수동으로 오히려 NuGet을 사용하는 것보다 그것을 구성하는 것을 선호하는 경우, 당신은 항상 새로운 MVC (5) 프로젝트에 MvcSiteMapProvider.MVC5를 추가 한 다음 새 사이의 구성의 차이를 조정할 수 있습니다 프로젝트와 현재 프로젝트.

+0

내 경우에는 - web.config에서이 사람이 문제를 일으켰습니다. (정확한 값 대신 5.0을 가졌습니다. 5.1) mvc5를 사용하고 있습니다. –