ASP.NET MVC 3、Razor 视图和可移植区域

Posted

技术标签:

【中文标题】ASP.NET MVC 3、Razor 视图和可移植区域【英文标题】:ASP.NET MVC 3, Razor Views, and Portable Areas 【发布时间】:2011-08-07 13:55:25 【问题描述】:

我正在尝试将可移植视图与 ASP.NET MVC 3 和 razor 视图一起使用,因为这似乎是创建简单插件架构的最佳方式。所以我有我的类库设置,我的视图位于 /Views/Admin/Index.cshtml 中,它被设置为嵌入式资源。然后,我将该项目作为主要 Web 应用程序项目的依赖项包含在内。当我尝试访问管理控制器时,索引操作我收到一条消息,找不到该视图文件(因此控制器被正确包含)。我假设它正在尝试查看主要的 Web 应用程序项目,而不是可移植区域二进制文件。有没有办法让剃刀视图与便携式区域一起使用?

【问题讨论】:

【参考方案1】:

我已经在这个特定问题上苦苦挣扎了一段时间,但我想我终于弄明白了。

文件夹结构和命名空间在项目中的调用方式对于正常工作非常重要!

我在这里有一个带有嵌入式剃须刀视图的便携式区域的工作示例:

https://github.com/fretje/MembershipStarterKit

看一下项目的结构。

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

还有其他对于嵌入视图的工作非常重要的事情:您必须在global.asax.cs 文件的Application_Start 方法中注册一个新的视图引擎,您这样做了吗?

PortableAreaRegistration.RegisterEmbeddedViewEngine();

并且...在您的注册类中,确保您覆盖了带有 2 个参数(AreaRegistrationContext contextIApplicationBus bus)的 RegisterArea 方法,并在其中调用基本实现:

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();

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

【讨论】:

感谢您的回答,正是我想要的。我仍然得到视图未找到错误。它被设置为嵌入但仍然没有。 我必须在我的网站中添加对 EmbeddedResourceVirtualPathProvider 的 nuget 包引用才能使其正常工作。 这看起来和我的一样。它在我的开发机器上运行良好,但它实际上并没有在部署后查找写入视图文件。我记录了它寻找的视图,它完全跳过了 .cshtml 文件,尽管它确实找到了 _layout 和 _viewstart 的文件。【参考方案2】:

我按照 Fretje 的回答中的说明完成了这项工作,然后还在您的网站中添加了对 EmbeddedResourceVirtualPathProvider 的 nuget 包引用。

【讨论】:

只是参考?你做了什么来连接它的? 在 Visual Studio 中,右键单击解决方案资源管理器中的引用,然后选择“添加库包引用”。在弹出窗口中选择“在线”并搜索“EmbeddedResourceVirtualPathProvider”,然后单击安装。请注意,您需要更新到 Service Pack 1 的 VS2010 才能让 Nuget 包安装程序成为其中的一部分。【参考方案3】:

您是否确保将视图标记为便携式区域中的嵌入式资源?

我还发现便携式区域的一个不错的功能是您可以覆盖嵌入式视图,因此如果您在主机应用程序中放置一个具有相同名称和位置且具有不同代码逻辑的嵌入式视图,它将优先于嵌入一​​个不错!!!

希望对你有帮助

【讨论】:

我想这取决于注册视图引擎的顺序,如果嵌入式视图引擎首先是可移植区域视图将覆盖根项目中的常规视图。作为旁注,我会说您有时可以通过清除所有视图引擎并确保只注册您在项目中使用的引擎来获得小的性能提升。见insightpassion.com/norbertraus/index.php/2011/04/29/…

以上是关于ASP.NET MVC 3、Razor 视图和可移植区域的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NEt MVC 使用 Web API 返回 Razor 视图

ASP.net MVC 3 Razor - jQuery Intellisense

ASP.NET MVC Razor

[MVC&Core]ASP.NET Core MVC 视图传值入门

[MVC&Core]ASP.NET Core MVC 视图传值入门

Razor 页面简化了 ASP.NET MVC 应用程序