我添加了一个名为home的区域,移动了我的控制器并查看它,现在我无法连接到索引视图

时间:2016-10-19 03:39:21

标签: asp.net-mvc mvcroutehandler

项目名称下的文件夹中已有控制器和视图。我添加了一个Area文件夹,然后在其中添加了一个区域并将其称为Home,然后将我的控制器和索引视图移动到其中。但是当我连接到索引时,我得到一个错误,看起来它寻找索引的路径是旧路径,我该如何将其更改为新路径?

这是我创造的

enter image description here

In' HomeAreaRegistration'我在RegstrationArea下看到了这个

public class HomeAreaRegistration : AreaRegistration 
{
    public override string AreaName 
    {
        get 
        {
            return "Home";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context) 
    {
        context.MapRoute(
            "Home_default",
            "Home/{controller}/{action}/{id}",
            new { action = "Index", id = UrlParameter.Optional }
        );
    }
}

但是当我在IE中运行应用程序时,这就是我在浏览器中看到的内容!看起来它在旧路径位置寻找index.cshtml,而不是新区域中的新路径位置' Home'

enter image description here

看起来路线引擎看错了位置。所以这是我的RouteConfig.cs文件的样子。

routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
        );

即使我尝试' https://localhost:44301/Home/Index.cshtml'它会抛出HTTP 404错误。

3 个答案:

答案 0 :(得分:3)

404错误显示主要问题本身:默认路由和视图引擎搜索在项目的Index.cshtml目录中找不到默认的Views视图文件(即ProjectName/Views/Index.cshtml指向路由{{ 1}})。

首先,创建一个类以包含自定义区域的视图位置搜索,如下例所示:

~/Views/Home/Index

然后,将所有区域和自定义视图引擎包含在public class CustomView : RazorViewEngine { public CustomView() { MasterLocationFormats: new[] { "~/Areas/Home/Views/{0}.cshtml", "~/Areas/Home/Views/{1}/{0}.cshtml" } ViewLocationFormats: new[] { "~/Areas/Home/Views/{0}.cshtml", "~/Areas/Home/Views/{1}/{0}.cshtml" } PartialViewLocationFormats = ViewLocationFormats; FileExtensions = new[] { "cshtml" }; } } 中:

Global.asax

如果protected void Application_Start() { // register all area locations AreaRegistration.RegisterAllAreas(); // clear default view engine ViewEngines.Engines.Clear(); // add your custom view engine here // the custom view engine should loaded before default view engine (e.g. Razor) ViewEngines.Engines.Add(new CustomView()); ViewEngines.Engines.Add(new RazorViewEngine()); } 目录中有RouteConfig个班级,请确保在默认路由前包含App_Start

RegisterAllAreas

此外,在需要时添加控制器名称的命名空间或上述解决方案仍然无效:

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
    AreaRegistration.RegisterAllAreas();
    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
    );
}

注意:如果您想要关注路由汇率public class HomeAreaRegistration : AreaRegistration { public override string AreaName { get { return "Home"; } } public override void RegisterArea(AreaRegistrationContext context) { context.MapRoute( "Home_default", "Home/{controller}/{action}/{id}", new { action = "Index", id = UrlParameter.Optional }, namespaces: new[] { "ProjectName.Areas.Home.Controllers" } ); } } ,请在Home下创建Views目录,并将~/Areas/Views/Home/Index文件放入其中。

参考文献:

How to set a Default Route (To an Area) in MVC

How to register areas for routing

答案 1 :(得分:0)

您必须在解决方案中进行以下更正:

1)在视图中添加文件夹主页并在其中放置index.cshtml。 用于视图的文件夹结构必须是:主页(区域名称)>意见> Home(与控制器同名)> index.cshtml(如图所示)

enter image description here

2)将Homecontroller的命名空间更改为(解决方案名称).Areas.Home.Controllers

3)此外,您还必须参考以下路线模式:

localhost/AreaName/Controller/Action

在你的情况下:

https://localhost:44301/Home/Home/Index

希望这可以解决您的问题

答案 2 :(得分:0)

您的区域文件夹结构如下所示

enter image description here

在Global.asax中注册您的区域

AreaRegistration.RegisterAllAreas();

尝试使用此网址

http://localhost:44301/Home/Home/Index