ASP.NET MVC 3、Razor视图和便携式区域

16

我试图在ASP.NET MVC 3和Razor视图中使用可移植视图,因为这似乎是创建易于插件架构的最佳方式。所以我已经设置好了我的类库,并将视图位于/Views/Admin/Index.cshtml,并将其设置为嵌入式资源。然后我将该项目作为主Web应用程序项目的依赖项包含在内。当我尝试访问Admin控制器的Index操作时,会收到一个消息,表示找不到该视图文件(因此控制器被正确地包括在内)。我假设它正在尝试查找主Web应用程序项目而不是可移植区域二进制文件。是否有办法让Razor视图与可移植区域一起工作?

3个回答

12

我在这个问题上一直挣扎了一段时间,但我认为我终于找到了解决方法。

对于这个问题,文件夹结构以及项目内命名空间的调用非常重要!

我在这里有一个嵌入Razor视图的可移植区域的工作示例:

https://github.com/fretje/MembershipStarterKit

请看项目的结构。

该区域的名称是UserAdministration,在项目根目录中有一个UserAdministrationRegistration类,它位于UserAdministration命名空间中。 然后还有一个ControllersModelsViews文件夹(就像一个普通的MVC项目一样),在Views文件夹下面,又有一个UserAdministration文件夹,其中包含该区域的视图。

还有一件非常重要的事情,让嵌入式视图起作用:你必须在你的global.asax.cs文件的Application_Start方法中注册一个新的视图引擎,你做到了吗?

PortableAreaRegistration.RegisterEmbeddedViewEngine();

并且...在你的注册类中,确保覆盖RegisterArea方法,该方法接受两个参数(AreaRegistrationContext contextIApplicationBus bus),并在其中调用基本实现:

public override void RegisterArea(AreaRegistrationContext context, 
    IApplicationBus bus)
{
    base.RegisterArea(context, bus); // <== very important!

    context.MapRoute(
        "UserAdministration", 
        AreaName + "/{controller}/{action}/{id}",
        new { controller = "UserAdministration", action = "Index", 
              id = UrlParameter.Optional }
    );
}
如果你不调用基础实现,至少要添加一个

RegisterAreaEmbeddedResources();

为确保您的嵌入式视图和资源已注册。


谢谢您的回答,正是我所需要的。但我仍然遇到了“视图未找到”的错误。虽然已经设置为嵌入式,但仍然没有显示出来。 - Pieter
我必须在我的网站中添加一个嵌入式资源虚拟路径提供程序的NuGet包引用才能使其正常工作。 - Pieter
这看起来和我之前的一样。在我的开发机上它能正常工作,但是一旦部署后实际上并没有查找正确的视图文件。我记录了它所查找的视图,并且完全跳过了 .cshtml 文件,尽管它确实找到了 _layout 和 _viewstart 的文件。 - user29439

1

我按照 Fretje 的答案指示操作,然后在您的网站中添加了一个 nuget 包引用 EmbeddedResourceVirtualPathProvider,这样就解决了问题。


只是引用?你是如何将其连接起来的? - user29439
1
在Visual Studio中,右键单击解决方案资源管理器中的引用,然后选择“添加库包引用”。在弹出窗口中选择“在线”,搜索“EmbeddedResourceVirtualPathProvider”,然后点击安装。请注意,您需要安装了服务包1的VS2010才能使用Nuget包安装程序。 - Pieter

0
你确定在可移植区域中将你的视图标记为嵌入式资源了吗?
此外,我发现可移植区域的一个很好的特性是你可以覆盖嵌入的视图。因此,如果你在宿主应用程序中放置了一个与嵌入式视图相同名称和位置但具有不同代码逻辑的视图,它将优先于嵌入式视图。太棒了!
希望这能帮到你。

我想这取决于已注册的视图引擎的顺序,如果嵌入式视图引擎是第一个,则可移植区域视图将覆盖根项目中的常规视图。另外,我要说的是,有时候通过清除所有视图引擎并确保仅注册您在项目中使用的视图引擎,您可以获得一些小的性能提升。请参见http://insightpassion.com/norbertraus/index.php/2011/04/29/razor-views-performance/。 - JohannesH

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