一条名为' Billing_Default'已经在路线集合中。路线名称必须是唯一的。参数名称:name

时间:2017-06-29 19:01:00

标签: c# asp.net asp.net-mvc mef

已删除的bin文件夹,也已多次清理和重建。出于某种原因,在检查了路由配置所需的所有文件后,我遇到了命名错误,我更改了它并将其设置到最佳程度,但我被卡住了。我正在尝试学习asp.net,但这个错误令我目瞪口呆。

这是文件夹系统,我扩展了重要的文件夹:

Project-
   Reference-
   Packages-
   App_Start-
       -RouteConfig.cs
       -WebApiConfig.cs
   Areas-
       -Billing
       -Invoice
   Content-
   Controllers-
   Models-
   Scripts-
   Views-
   Global.asax
   Pacages.config
   Web.config

我的每个区域都有一个注册文件。

以下是其中一个区域的注册码。

using System;
using System.Web.Mvc;

namespace WORK_GODDAMN.Areas.Billing
{

    public class BillingAreaRegistration : AreaRegistration
    {
        public override string AreaName
        {
            get
            {
                return "Billing";
            }
        }

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



}

这是我的Global.asax代码

using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
using System.Web.Http;

namespace WORK_GODDAMN
{
    public class Global : HttpApplication
    {
        protected void Application_Start()
        {
            AreaRegistration.RegisterAllAreas();
            GlobalConfiguration.Configure(WebApiConfig.Register);
            RouteConfig.RegisterRoutes(RouteTable.Routes);
        }
    }
}

这是我的routeConfig代码

using System.Web.Mvc;
using System.Web.Routing;

namespace WORK_GODDAMN
{
    public class RouteConfig
    {
        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 },
                namespaces: new string[] { "Core.Controllers" }
            );

        }
    }
}

索引页面的cshtml代码,它应该重定向到预定义的区域。

<!DOCTYPE html>

<html>
    @using System.Web.Optimization
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width" />
    <title>@ViewBag.Title</title>
    @Scripts.Render("~/Scripts/modernizr.js")
</head>
<body>
    <div>
        <div>
            <h2>{Demo}- Pluggable Modules</h2>
        </div>
        <div id="nav">
            @Html.ActionLink("Home","Index","Home", new {Area=""}, null) |
            @Html.ActionLink("Marketing","Index","Marketing", new {Area="Marketing"}, null) |
            @Html.ActionLink("BillingMain", "Index", new { Area = "Billing" })
        </div>
        <hr />
        <div>
                @RenderBody()
        </div>
    </div>
    @Scripts.Render("~/Scripts/jquery.js")
    @RenderSection("Scripts", required: false)
</body>
</html>

我不是为什么会发生这种冲突,我已多次清理和重建,我使用2017 Mac Visual Studio,所以我必须自己配置区域。

1 个答案:

答案 0 :(得分:1)

在此ActionLink中:

@Html.ActionLink("BillingMain", "Index", new { Area = "Billing" })

您没有指定控制器参数。

在您的区域注册中,您也没有指定控制器参数。

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

如果您未在路线中指定控制器参数,则它是必需参数,而不是可选参数。因此,此操作链接将与您的区域路线不匹配,并将尝试匹配注册的下一条路线(很可能是您的默认路线)。

要使控制器可选,您必须指定默认值。

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

否则,必须在ActionLink中提供它才能匹配:

@Html.ActionLink("Billing","Index","BillingMain", new {Area=""}, null)

路由值的最符合逻辑的行为通常是使值必需(就像你一样),因此只有在ActionLink提供值时它们才匹配。