Mono MVC5 - 视图无法正常工作

16

我正在尝试使用Mono和XSP4在我的Linux机器上启动MVC5网站。如果没有视图,它可以正常工作,但是当我尝试渲染一些东西时,它会出现错误。

以下是我的测试代码。请注意,我没有更改任何内容,这基本上是一个空白站点,没有EF或任何其他库。只有裸骨MVC5 + Razor。

public ActionResult Index()
{
    // return Content("'sall good"); // works
    return View();
}
:无法找到 Razor 主机工厂类型:System.Web.Mvc.MvcWebRazorHostFactory,System.Web.Mvc,Version=5.0.0.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35。 描述:HTTP 500。请求处理错误。 详细信息:非 Web 异常。异常来源(应用程序或对象名称):System.Web.WebPages.Razor。 堆栈跟踪:
at System.Web.WebPages.Razor.WebRazorHostFactory.CreateFactory (System.String typeName) [0x00000] in <filename unknown>:0

at System.Collections.Concurrent.ConcurrentDictionary`2+<GetOrAdd>c__AnonStorey3[System.String,System.Func`1[System.Web.WebPages.Razor.WebRazorHostFactory]].<>m__0 () [0x00000] in <filename unknown>:0 

at (wrapper delegate-invoke) System.Func`1<System.Collections.Generic.KeyValuePair`2<string, System.Func`1<System.Web.WebPages.Razor.WebRazorHostFactory>>>:invoke_TResult__this__ ()

...

我尝试将Version=5.0.0.0更改为4.0.0.0和3.0.0.0等,但都没有起作用。现在出现了关于4.0.0.0的相同错误。

还有希望吗?


你尝试过执行以下命令吗:sudo apt-get install asp.net-examples。 - David Crowell
@DavidCrowell 不是的,据我所知它们已经毫无意义了,因为它们是三年前的版本。它们展示了MVC2的工作方式。我从git上获取mono并从源代码编译,因为官方网站滞后。而在aptitude存储库中的mono也是非常老的版本。 - Stan
你是否已经设置好了log4net?TypeFactory(在WebRazorHost中引用)使用log4net。 - David Crowell
有一些人为了让MVC5能够在Mono上运行,贡献了拉取请求。你应该编译包含这些拉取请求的Mono版本,看看它们是否有帮助。如果有帮助,请在拉取请求上加上“+1”(这将有望加快审核过程)。 - knocte
@knocte,我找不到那个拉取请求。我想它已经被删除了。这周我尝试使用最新的git mono再次测试它,但似乎根本没有改动。顺便说一下,这是我的测试项目:https://github.com/stanislavromanov/MVC5Mono - Stan
拉取请求无法被删除,它在这里:https://github.com/mono/mono/pull/888 - knocte
6个回答

32
问题出在位于 /Views 文件夹内的 Web.config 中。system.web.webPages.razor 的 host 参数必须与 MVC 版本完全匹配。
例如,如果您有 MVC 5.2.2.0,则应该如下所示:<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.2.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

1
在 Stack Overflow 上有几个关于这个问题和答案的版本,但这个是最好的,因为你实际上指出了位置——这样人们可以比较外部配置文件中的版本与视图中的版本是否被覆盖。 - roberto tomás
2
谢谢!在我的情况下,VSMac将Microsoft.AspNet.Mvc包更新到了5.2.7,但没有触及Views/文件夹下的Web.config文件,该文件的版本为5.2.3 - ogirginc

6

您的项目的MVC版本必须与MvcWebRazorHostFactory的版本匹配,它们必须相同。我不得不将版本更改为5.2.3.0(在Views/Web.config文件中)。

<system.web.webPages.razor>
    <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0

如果您不知道项目中使用的MVC版本,请前往“项目”->“编辑引用”,然后在右侧的“选定引用”下向下滚动到System.Web.Mvc,您将看到正在使用的版本。这就是我在Xamarin Studio Community中找到的方法。

1

我更新了软件包并运行代码后,收到了相同的错误。

错误:System.InvalidOperationException 找不到 Razor 主机工厂类型:System.Web.Mvc.MvcWebRazorHostFactory,System.Web.Mvc,Version=5.2.3.0,Culture=neutral,PublicKeyToken=31BF3856AD364E35

在“Views”文件夹下的 Web.config 文件中更改 System.Web.Mvc 的更新版本

system.web.webPages.razor

host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"

我将 System.Web.Mvc 的版本从 5.2.3.0 更改为 5.2.7.0,然后代码就能执行了。


0

这个方法对我有效。 我根据我的Mvc版本,更改了Views文件夹中的Web.config文件中的Mvc版本为5.2.3.0。 例如:<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

我将版本从5.2.0.0更改为5.2.3.0。


0

@stan的解决方案帮助我解决了这个问题。

我正在使用Mac M1芯片上的Visual Studio。

在我的情况下,我在views/web.config文件中修复了以下内容:

<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>

<system.web.webPages.razor>
<host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />

<pages validateRequest="false" pageParserFilterType="System.Web.Mvc.ViewTypeParserFilter, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" pageBaseType="System.Web.Mvc.ViewPage, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" userControlBaseType="System.Web.Mvc.ViewUserControl, System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35">
  <controls>
    <add assembly="System.Web.Mvc, Version=5.2.4.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" namespace="System.Web.Mvc" tagPrefix="mvc" />
  </controls>
</pages>

根据 References > Packages 中的版本更新版本,检查版本并进行更新。

重新构建项目/解决方案


-1

就像Stan所说的那样。在您的项目中的引用文件夹上进行“右键单击>属性”操作,检查您的System.Web.MVC版本。然后,在您的/views/web.config中更新该行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接