我正在努力将我的MVC 3应用程序(我最近从MVC 2转换,使用MS工具)中的一些部分视图从ascx转换为cshtml(Razor)。
简单地说:我正在尝试直接从aspx母版页执行Razor局部视图的Html.RenderPartial。 Razor局部视图中只有“Hello World” - 没有@model或@inherits或任何东西。当我运行我的应用程序时,此时我收到以下错误:“..... cshtml的视图必须从ViewPage,ViewPage,ViewUserControl或ViewUserControl派生。”换句话说,看起来它正在寻找一个非剃刀视图。
所以..如果我明确地将“@inherits ViewUserControl”放在我的剃刀部分的顶部,我会得到一个不同的错误:“... cshtml.Execute():找不到合适的方法来覆盖。”
我从零开始创建了一个新的MVC 3应用程序,最简单的尝试了同样的东西。在剃刀部分上执行RenderPartial的aspx母版页。它工作正常。但是这个大毛茸茸的现有应用程序太大了,无法从头开始。但是那里有一些东西可以防止这种情况发生。
这可能看起来像是其他一些问题的副本,但我已经尝试过我发现的所有问题。我甚至从我的机器上卸载了MVC 2。建议/帮助将是最受欢迎的!
谢谢...
答案 0 :(得分:2)
尝试比较这两个项目,看看是否存在任何显着差异 - 特别是Web.config(尽管也可能是csproj中的设置)。用于视图/页面的基本类型之类的东西存储在web.config中,因此它们可能被错误地设置,甚至可能从原始项目中丢失。
默认的MVC项目在views文件夹的web.config中有这样的东西:
<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
<pages pageBaseType="System.Web.Mvc.WebViewPage">
和
<pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
答案 1 :(得分:1)
在这里回答我自己的问题..
事实证明,MVC 2应用程序(我没有写,顺便说一句)使用自定义的ViewEngine,它源自WebFormViewEngine。当我将部分视图转换为剃刀时,我将“〜/ Views / Shared / Modules / {0} .cshtml”添加到该类中的locations数组中,而没有意识到它正在使用WebFormViewEngine。
所以,我最终创建了自己的ViewEngine,它派生自RazorViewEngine ...并将my / Modules路径添加到那个。它有效!
重新开始并手动将应用程序转换为MVC 3帮助(再次感谢Darin D),因为它迫使我自己完成所有步骤,并让我找到了这个问题。