我正在尝试将可移植视图与 ASP.NET MVC 3 和 razor 视图一起使用,因为这似乎是创建简单插件架构的最佳方式。所以我有我的类库设置,我的视图位于 /Views/Admin/Index.cshtml 中,它被设置为嵌入式资源。然后,我将该项目作为主要 Web 应用程序项目的依赖项包含在内。当我尝试访问管理控制器时,索引操作我收到一条消息,找不到该视图文件(因此控制器被正确包含)。我假设它正在尝试查看主要的 Web 应用程序项目,而不是可移植区域二进制文件。有没有办法让剃刀视图与便携式区域一起工作?
3 回答
我已经在这个特定问题上苦苦挣扎了一段时间,但我想我终于弄明白了。
文件夹结构以及如何在项目中调用命名空间对于正常工作非常重要!
我在这里有一个带有嵌入式剃须刀视图的便携式区域的工作示例:
看一下项目的结构。
该区域的名称是UserAdministration
,并且在项目的根目录中有一个UserAdministrationRegistration
类,它驻留在UserAdministration
命名空间中。然后是Controllers
,Models
和Views
文件夹(就像普通的 MVC 项目一样),在Views
文件夹下,还有一个UserAdministration
文件夹,其中包含该区域的视图。
还有其他对于嵌入视图的工作非常重要的事情:您必须在文件的Application_Start
方法中注册一个新的视图引擎global.asax.cs
,您这样做了吗?
PortableAreaRegistration.RegisterEmbeddedViewEngine();
并且...在您的注册类中,确保您覆盖RegisterArea
采用 2 个参数(AreaRegistrationContext context
和IApplicationBus 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();
确保您的嵌入式视图和资源已注册。
我按照Fretje的回答中的说明完成了这项工作,然后还在您的网站中添加了对EmbeddedResourceVirtualPathProvider的 nuget 包引用。
您是否确保在便携式区域中将视图标记为嵌入式资源?
我还发现便携式区域的一个不错的功能是您可以覆盖嵌入式视图,因此,如果您在主机应用程序中放置一个具有相同名称和位置且具有不同代码逻辑的嵌入式视图,它将优先于嵌入式视图!!!
希望这可以帮助