ASP.Net MVC路由问题网址无法正常工作

时间:2012-08-07 07:52:33

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

我在家庭控制器中创建了两个具有不同名称的动作方法

public ActionResult Default()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        return View("index");
    }

    public ActionResult Index(int a)
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + a;
        return View();
    }

我的路由代码看起来像

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

            routes.MapRoute(
                "Default2", // Route name
                "{Home}", // URL with parameters
                new { controller = "Home", action = "Default" }
            );

            routes.MapRoute(
                "Default", // Route name
                "{controller}", // URL with parameters
                new { controller = "Home", action = "Default" }
            );

但仍然遇到问题

当我输入类似 http:// localhost:7221 的网址时,就会调用home并调用Default()方法,但如果我输入类似网址

http:// localhost:7221 / Home 然后收到错误。为了处理这种情况,我定义了像

这样的路线

routes.MapRoute(                     “Default2”,//路由名称                     “{Home}”,//带参数的网址                     new {controller =“Home”,action =“Default”}                 );

但它不起作用.......你可以告诉我原因吗。

如果我输入类似 http:// localhost:7221 / Home / 88 的网址,则应调用Index(int a)方法,但会收到错误。为什么

我希望当我输入网址 http:// localhost:7221 http:// localhost:7221 / Home 时,应调用默认值()我会输入

http:// localhost:7221 / Home / 88 然后应调用Index(int a)。我的路线有什么问题。我怎么能纠正它。如果可能的话纠正我的路线代码。感谢

4 个答案:

答案 0 :(得分:5)

此规则实际上应涵盖您需要的所有内容:

        routes.MapRoute(
            "Default",
            "{controller}/{action}/{a}",
            new {
                controller = "Home",
                action = "Index",
                a = UrlParameter.Optional 
            }
        );

请注意以下事项:

  1. 参数名称需要与方法上的参数匹配,您有ida - 因此框架无法匹配它们。在上面的规则中,我已将a放在映射规则中以匹配您的方法,但您应该在两个地方都给它一个更好的名称。

  2. 如果未提供控制器或操作,则此规则默认为/ Home / Index。如果您想点击名为Default的操作,您将转到/ Home / Default

  3. 如果您提供/ Home / Index / 21,它将调用Index方法 - 但如果您没有提供年龄,则会出现问题,因为您没有方法可以匹配该规则。您需要添加方法public ActionResult Index()或使用默认值public ActionResult Index(int a = 0)

  4. 以下是一些可能违反此规则的网址示例。

    • http://yourapp/ - 将转至/ Home / Index
    • http://yourapp/Home - 将转至/ Home / Index
    • http://yourapp/Home/Default - 将转至/ Home / Default
    • http://yourapp/Home/Index - 请参阅上面的说明 - 您需要一种方法来支持此
    • http://yourapp/Home/Index/21 - 将转至/ Home / Index并将a传递为21

答案 1 :(得分:4)

您遇到问题的原因是您的路线参数与操作方法不匹配。你的action方法需要int a,但是你在任何情况下都没有提供它,你给出了一个名为id的整数。

你应该在routevalues中拥有的是:

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

请注意age参数是如何可选的。我们的控制器应该是这样的:

public class HomeController : Controller
{

    public ActionResult Index(int? age)
    {
        if ( age != null )
            ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + age;
        else
            ViewData["Message"] = "Welcome to ASP.NET MVC!";

        return View();
    }
}

当然,我们可以使用名为id的参数,但为了演示目的,我将其称为年龄。

<强>更新

这是一个更接近原始请求的内容:

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

控制器:

    public ActionResult Index()
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC!";
        return View();
    }
    public ActionResult IndexA(int age)
    {
        ViewData["Message"] = "Welcome to ASP.NET MVC! and Your Age is " + age;
        return View("Index");
    }

答案 2 :(得分:2)

删除大括号arround Home,将ID更改为Age并删除Age的可选行为。

routes.MapRoute(
    "Default1", // Route name
     "Home/{Age}", // URL with parameters
     new { controller = "Home", action = "Index" }
);

我希望我能理解你正在努力实现的目标。如果没有,我建议使用Route调试器进一步了解。

尝试https://github.com/Haacked/RouteMagic(在NuGet上可用作RouteMagic.Mvc)

我自己没有尝试过,但我确实使用过它的一个组成部分。

祝你好运!

答案 3 :(得分:1)

您遇到的错误是什么?我只是不想在这里做任何事情。我认为// localhost:7221 / Home调用失败,因为它与第一个路由匹配(因为id参数是可选的),而不是你想要的第二个路由。此外,路径定义中的参数名称应与操作方法声明中的参数名称匹配。

  

如果我输入类似// localhost:7221 / Home / 88的url那么应该调用Index(int a)方法但是会出错。为什么

将参数重命名为id或将路由可选参数重命名为a。路由引擎找不到任何东西来推断“a”的值,所以它试图传递一个空值来代替一个无可空的int参数,从而产生错误。

  

我希望当我输入url // localhost:7221或// localhost:7221 / Home时应该调用Default()

然后将最后一条路线的映射移动到代码块的顶部,就像它将首先添加到routes集合和localhost:7221 / Home将首先匹配它。

您还应该看看Phil Haack的这个工具:

http://haacked.com/archive/2008/03/13/url-routing-debugger.aspx