asp.net-mvc2 - 控制器在返回View()时不考虑区域

时间:2011-09-14 16:44:28

标签: asp.net-mvc-2 view asp.net-mvc-areas

在位于某个区域的控制器中调用return View()时,它会尝试在主~/Views/{Controller}/文件夹和主~/Views/Shared/文件夹中找到该视图。它不会查看~/{Area}/Views/{Controller}/文件夹。

我尝试将area的路由值添加到MapRoute函数,并尝试将“area”的'datatoken'添加到Route的DataTokens属性。

我在这里错过了什么吗?

这是MapRoute电话:

routes.MapRoute("Product", "Products/{GroupName}/{CategoryId}/{CategoryName}/{ProductId}/{ProductName}/{PageName}", New With {.Area = "Products", .controller = "Products", .action = "Product", .PageName = ""}, New With {.CategoryId = "[0-9]*", .ProductId = "[0-9]*"})

2 个答案:

答案 0 :(得分:0)

一般的东西要看:

您是否已注册区域映射和区域映射? 你有两个位置的控制器同名吗?

global.asax中的区域映射示例
见行:AreaRegistration.RegisterAllAreas(); //这是你需要做的部分

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        "Default", // Route name
        "{controller}/{action}/{id}", // URL with parameters
        new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
    );

}

protected void Application_Start()
{

    AreaRegistration.RegisterAllAreas();  //  This is part you neeed to do
    RegisterRoutes(RouteTable.Routes);
    ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
}

}

并且每个区域都必须在某处设置映射或映射文件。 这里的例子

命名空间项目 {     ///     ///管理区域的注册     ///     public class AdministratorAreaRegistration:AreaRegistration     {         ///         ///获取要注册的区域的名称。         ///         ///要注册的区域的名称。         公共覆盖字符串AreaName         {             得到             {                 返回“管理员”;             }         }

    /// <summary>
    /// Registers an area in an ASP.NET MVC application using the specified area's context information.
    /// </summary>
    /// <param name="context">Encapsulates the information that is required in order to register the area.</param>
    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Administrator_default",
            "Administrator/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional });
    }
}

}

如果你有路由问题,请检查一下。

我建议使用本指南,并为每个路由创建测试: http://haacked.com/archive/2007/12/17/testing-routes-in-asp.net-mvc.aspx

答案 1 :(得分:0)

正如我们通常使用的区域一样,我们添加了AeaRegistraion文件(FooAreaRegistration.cs)并覆盖了AreaName和RegisterArea()方法。 AreaName我们设置为AearRegistration文件所在文件夹相对于全局应用程序的相对路径。以下是示例。

public class FooAreaRegistration : AreaRegistration
{
    /// <summary>
    /// Get the Area Name
    /// </summary>
    public override string AreaName
    {
        get { return "ParentApp/AreaFolder"; }
    }

    /// <summary>
    /// Map and Route the area
    /// </summary>
    /// <param name="context"></param>
    public override void RegisterArea(AreaRegistrationContext context)
    {
        if (null != context)
        {
            //context.maproute goes here              
        }            
    }
}