我在主控制器中创建了两个名称不同的操作方法
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:7221 或 http://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
}
);
请注意以下几点:
- 参数
名称需要与方法上的参数匹配,您有
id
和a
- 因此框架无法匹配它们。在上面的规则中,我在映射规则中放置了a
以匹配您的方法,但是您应该在两个地方都给它一个更好的名称。如果未提供控制器或操作,则此规则默认为/Home/Index。如果要点击已命名
Default
的操作,请转到/主页/默认如果您提供/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