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