ASP.Net MVC 路由问题 URL 不起作用



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

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)。我的路线出了什么问题?我该如何纠正它?如果可能的话,纠正我的路线代码。谢谢

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

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

请注意以下几点:

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

  2. 如果未提供控制器或操作,则此规则默认为/Home/Index。如果要点击已命名Default的操作,请转到/主页/默认

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

下面是一些应与此规则相抵触的网址示例。

  • http://yourapp/ - 将转到/主页/索引
  • http://yourapp/Home - 将转到/主页/索引
  • http://yourapp/Home/Default - 将转到/主页/默认
  • http://yourapp/Home/Index - 请参阅我上面的注释 - 您需要一种方法来支持这一点
  • http://yourapp/Home/Index/21 - 将转到/Home/Index 并将a传递为 21

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

路由值中应该包含的内容是:

        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的参数,但我将其称为年龄以用于演示目的。

更新:

以下是更接近您的原始请求的内容:

        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");
    }

删除"主页"周围的大括号,将 ID 更改为"年龄",然后删除"年龄"的可选行为。

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

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

尝试 https://github.com/Haacked/RouteMagic(在NuGet上作为RouteMagic.Mvc提供)

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

祝你好运!

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

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

将参数重命名为 ID,或将路由可选参数重命名为 A。路由引擎找不到任何可以推断"a"值的内容,因此它尝试传递一个空值来代替一个无可为空的 int 参数,因此会出现错误。

我希望当我输入网址//localhost:7221 或//

localhost:7221/Home 时,应该调用 Default()

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

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

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

最新更新