ASP.NET MVC 3,Razor Views和Portable Areas如何使用?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (30)

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

提问于
用户回答回答于

在网站中添加一个nuget包引用到EmbeddedResourceVirtualPathProvider

用户回答回答于

我在这个问题上一直在努力,但我想我终于明白了。

文件夹结构以及如何在您的项目中调用名称空间对于此功能正常工作非常重要!

我在这里有一个嵌入式razor图的便携式区域的工作示例:

https://github.com/fretje/MembershipStarterKit

看看这个项目的结构。

该区域的名称是UserAdministrationUserAdministrationRegistration项目的根目录中有一个类,该类位于UserAdministration名称空间中。然后还有一个ControllersModelsViews文件夹(就像一个正常的MVC项目)和下Views文件夹,里面又是一个UserAdministration包含了区域意见的文件夹。

还有一些对嵌入式视图非常重要的工作:必须在文件的Application_Start方法中注册一个新的视图引擎,global.asax.cs是否这样做?

PortableAreaRegistration.RegisterEmbeddedViewEngine();

并且...在注册类中,确保重写RegisterArea需要2个参数(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();

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

扫码关注云+社区