ASP.NET MVC 4不正确的主路由

时间:2015-12-21 22:56:05

标签: asp.net-mvc asp.net-mvc-routing

在我的RouteConfig中添加产品路线后,我的默认主页更改为“产品”页面。如何再次将我的家庭控制器设置为我的默认主页。

     routes.MapRoute(
            name: "Product",
            url: "{controller}/{action}",
            defaults: new { controller = "Product", action = "Index" }
        );


        routes.MapRoute(
            name: "Products",
            url: "products/{categoryName}/{Id}",
            defaults: new { controller = "Products", action = "Index", categoryName = "", Id = UrlParameter.Optional }
        );


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

2 个答案:

答案 0 :(得分:0)

这是我的路线表。它默认不使用我在表格上标记的路线。

Screenshot of the route table

答案 1 :(得分:0)

我认为第一个和最后一个将以相同的方式行动。程序将选择匹配的第一个路线,因此您应该像这样硬编码第一条路线。

  routes.MapRoute(
        name: "Product",
        url: "Product/{action}",
        defaults: new { controller = "Product", action = "Index" }
    );

或者你应该删除第一条路线。我认为你应该采用这种方法。

      routes.MapRoute(
            name: "Products",
            url: "products/{categoryName}/{Id}",
            defaults: new { controller = "Products", action = "Index", categoryName = "", Id = UrlParameter.Optional }
        );


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

<强>说明: 来自斯蒂芬沃尔特的post

默认路由表包含单个路由(名为Default)。默认路由将URL的第一个段映射到控制器名称,将URL的第二个段映射到控制器操作,将第三个段映射到名为id的参数。

假设您在网络浏览器的地址栏中输入以下网址:

/Home/Index/3

默认路由将此URL映射到以下参数:

  controller = Home

    action = Index

    id = 3

当您请求URL / Home / Index / 3时,将执行以下代码:

HomeController.Index(3)

默认路由包括所有三个参数的默认值。如果您不提供控制器,则控制器参数默认为Home。如果您不提供操作,则action参数默认为值Index。最后,如果您不提供id,则id参数默认为空字符串。

让我们看几个默认路由如何将URL映射到控制器操作的示例。想象一下,您在浏览器地址栏中输入以下URL:

/Home

由于Default route参数的默认值,输入此URL将导致调用清单2中的HomeController类的Index()方法。

清单2 - HomeController.cs

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(string id)
        {
            return View();
        }
    }

}

在清单2中,HomeController类包含一个名为Index()的方法,该方法接受名为Id的单个参数。 URL / Home导致使用空字符串作为Id参数的值调用Index()方法。

由于MVC框架调用控制器操作的方式,URL / Home也匹配清单3中HomeController类的Index()方法。

清单3 - HomeController.cs(没有参数的索引操作)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    }
}

清单3中的Index()方法不接受任何参数。 URL / Home将导致调用此Index()方法。 URL / Home / Index / 3也调用此方法(忽略Id)。

URL / Home还匹配清单4中HomeController类的Index()方法。

清单4 - HomeController.cs(带可为空参数的索引操作)

 using System.Web.Mvc;

    namespace MvcApplication1.Controllers
    {
        [HandleError]
        public class HomeController : Controller
        {
            public ActionResult Index(int? id)
            {
                return View();
            }
        }
    }

在清单4中,Index()方法有一个Integer参数。因为参数是可以为空的参数(可以具有值Null),所以可以在不引发错误的情况下调用Index()。

最后,使用URL / Home调用清单5中的Index()方法会导致异常,因为Id参数不是可为空的参数。如果您尝试调用Index()方法,则会得到图1中显示的错误。

清单5 - HomeController.cs(带有Id参数的索引操作)

using System.Web.Mvc;

namespace MvcApplication1.Controllers
{
    [HandleError]
    public class HomeController : Controller
    {
        public ActionResult Index(int id)
        {
            return View();
        }
    }
}