Asp.net mvc MVC2到MV4转换错误

Asp.net mvc MVC2到MV4转换错误,asp.net-mvc,Asp.net Mvc,我在MVC2中有一个项目,我将它转换为MVC3,然后我将它转换为MVC4,我使用工具将aspx视图转换为Razor视图, 在转换成功编译的应用程序后,我还安装了MVC3和MVC4,但当我运行应用程序时,它会显示错误 无法强制转换类型为“Microsoft.Web.Mvc.FixedRazorViewEngine”的对象 键入“System.Web.Mvc.WebFormViewEngine” 在Global.asax中 private static void AddViewPaths() {

我在MVC2中有一个项目,我将它转换为MVC3,然后我将它转换为MVC4,我使用工具将aspx视图转换为Razor视图, 在转换成功编译的应用程序后,我还安装了MVC3和MVC4,但当我运行应用程序时,它会显示错误

无法强制转换类型为“Microsoft.Web.Mvc.FixedRazorViewEngine”的对象 键入“System.Web.Mvc.WebFormViewEngine”

在Global.asax中

private static void AddViewPaths()
{
    foreach (var engine in ViewEngines.Engines)
    {              
        ((WebFormViewEngine)engine).PartialViewLocationFormats =
            ((WebFormViewEngine)engine).PartialViewLocationFormats.Union(
            new string[] { "~/Views/Sample/{0}.aspx", "~/Views/Sample/{0}.ascx" }).ToArray();

          ((WebFormViewEngine)engine).ViewLocationFormats =
              ((WebFormViewEngine)engine).ViewLocationFormats.Union(
              new string[] { "~/Views/Sample/{0}.aspx", "~/Views/Sample/{0}.ascx" }).ToArray();
      }
}
我试着把这些行改成这个,但还是同一个问题,我该怎么办

 ((WebFormViewEngine)engine).PartialViewLocationFormats =
        ((WebFormViewEngine)engine).PartialViewLocationFormats.Union(
        new string[] { "~/Views/Sample/{0}.cshtml", "~/Views/Sample/{0}.cshtml" }).ToArray();

  ((WebFormViewEngine)engine).ViewLocationFormats =
        ((WebFormViewEngine)engine).ViewLocationFormats.Union(
        new string[] { "~/Views/Sample/{0}.cshtml", "~/Views/Sample/{0}.cshtml" }).ToArray();

问题是我在ViewEngines中同时使用了Razor和WebForms。Engines集合,我如何才能仅获取Razor视图自从您移动到Razor(MVC 2中不可用),您现在的for循环中提供的不仅仅是
WebFormsViewEngine
。正如现在编写的代码,它试图将Razor引擎强制转换为WebForms引擎,但这是无法完成的。如果您更新了硬铸件并删除了所有其他引擎,它应该可以工作,您可以摆脱for循环-您的集合中只有一个引擎

应用程序启动

//clear all but RazorViewEngine
ViewEngines.Engines.Clear();
ViewEngines.Engines.Add(new RazorViewEngine());
现在,您的更新代码只需

  var engine = ViewEngines.Engines.First();
  ((RazorViewEngine)engine).PartialViewLocationFormats =
    ((RazorViewEngine)engine).PartialViewLocationFormats.Union(
     new string[] { "~/Views/Sample/{0}.cshtml", "~/Views/Sample/{0}.cshtml" }).ToArray();

  ((RazorViewEngine)engine).ViewLocationFormats =
    ((RazorViewEngine)engine).ViewLocationFormats.Union(
     new string[] { "~/Views/Sample/{0}.cshtml", "~/Views/Sample/{0}.cshtml" }).ToArray();

如果您决定不删除所有引擎,那么您必须在for循环中执行
If/else
,以确定转换引擎的方式。

但是您在修复中没有更改任何内容:您仍然试图将
engine
转换为
WebFormViewEngine
@Rup-您是对的。我只是在VS中检查我的答案,并确认我必须强制转换到特定的视图引擎。如果OP从集合中移除所有引擎并更改其演员阵容,则他应处于清场。上面的编辑是为我编译的,但因为我真的不知道这是做什么的,所以我无法进一步测试。感谢您指出需要维护显式强制转换!:)