2

我在主控制器中创建了两个名称不同的操作方法

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这样的 URL 时,主页即将到来并调用 Default() 方法,但是如果我输入像这样的 URL

http://localhost:7221/Home然后出现错误。为了处理这种情况,我定义了类似的路线

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

但它不起作用.......你能告诉我为什么吗?

如果我输入像http://localhost:7221/Home/88这样的URL,那么应该调用 Index(int a) 方法但会出错。为什么

我希望当我输入 URL http://localhost:7221http://localhost:7221/Home时,应该调用 Default() 以及何时输入

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

4

4 回答 4

5

这条规则实际上应该涵盖你需要的一切:

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

请注意以下事项:

  1. 参数名称需要与方法上的参数相匹配,你有id-a所以框架不能匹配它们。在上面的规则中,我已经a输入了映射规则来匹配你的方法,但是你应该在两个地方给它一个更好的名字。

  2. 如果未提供控制器或操作,则此规则默认为 /Home/Index。如果你想点击你命名的动作,Default你会去 /Home/Default

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

以下是一些违反此规则的 URL 示例。

  • 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传递
于 2012-08-07T08:39:43.577 回答
4

您遇到问题的原因是您的路由参数与操作方法不匹配。您的操作方法需要 int a,但在任何情况下您都没有提供它,而是提供了称为 id 的整数。

您应该在 routevalues 中拥有的是:

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

注意年龄参数是可选的。我们的控制器应该如下所示:

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 的参数,但出于演示目的,我将其称为 age。

更新:

这是更接近您原始要求的内容:

        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");
    }
于 2012-08-07T08:37:14.277 回答
2

删除 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 提供)

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

祝你好运!

于 2012-08-07T11:33:32.353 回答
1

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

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

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

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

然后将最后一个路由的映射移动到代码块的顶部,就像它将首先添加到路由集合中一样,并且 localhost:7221/Home 将首先与之匹配。

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

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

于 2012-08-07T10:08:46.020 回答