ASP.NET MVC 3,Razor Views和Portable Area

rya*_*zec 16 mvccontrib portable-areas razor asp.net-mvc-3

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

fre*_*tje 12

我一直在努力解决这个问题,但我想我终于明白了.

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

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

https://github.com/fretje/MembershipStarterKit

看看项目的结构.

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

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

PortableAreaRegistration.RegisterEmbeddedViewEngine();
Run Code Online (Sandbox Code Playgroud)

并且...在您的注册类中,确保覆盖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 }
    );
}
Run Code Online (Sandbox Code Playgroud)

如果不调用基本实现,则必须至少添加一个

RegisterAreaEmbeddedResources();
Run Code Online (Sandbox Code Playgroud)

确保已注册嵌入的视图和资源.


Dev*_*nia 0

您是否确定将视图标记为可移植区域中的嵌入资源?

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

希望这可以帮助