0

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

这是我创建的

在此处输入图像描述

在“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”中的新路径位置

在此处输入图像描述

看起来路由引擎正在寻找错误的位置。所以这就是我的 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 错误。

4

3 回答 3

3

404 错误显示了主要问题本身:默认路由和视图引擎搜索在您的项目目录中找不到默认Index.cshtml视图文件Views(即ProjectName/Views/Index.cshtml由 route 指向~/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/IndexIndex.cshtml

参考:

如何在 MVC 中设置默认路由(到某个区域)

如何注册路由区域

于 2016-10-19T04:51:39.820 回答
0

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

1) 在 Views 中添加一个文件夹 Home,并将 index.cshtml 放入其中。视图的文件夹结构必须是:Home(区域名称)> Views > Home(与控制器同名)> index.cshtml(如图所示)

在此处输入图像描述

2) 将 Homecontroller 的命名空间更改为 (Solution name).Areas.Home.Controllers

3)您还必须参考以下区域的路线模式:

localhost/AreaName/Controller/Action

在你的情况下:

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

希望这可以解决您的问题

于 2016-10-19T04:51:00.443 回答
0

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

在此处输入图像描述

在 Global.asax 中重新注册您的区域

AreaRegistration.RegisterAllAreas();

并尝试使用此网址

http://localhost:44301/Home/Home/Index
于 2016-10-19T04:57:28.183 回答