我在家庭控制器中创建了两个具有不同名称的动作方法
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)。我的路线有什么问题。我怎么能纠正它。如果可能的话纠正我的路线代码。感谢
答案 0 :(得分:5)
此规则实际上应涵盖您需要的所有内容:
routes.MapRoute(
"Default",
"{controller}/{action}/{a}",
new {
controller = "Home",
action = "Index",
a = UrlParameter.Optional
}
);
请注意以下事项:
参数名称需要与方法上的参数匹配,您有id
和a
- 因此框架无法匹配它们。在上面的规则中,我已将a
放在映射规则中以匹配您的方法,但您应该在两个地方都给它一个更好的名称。
如果未提供控制器或操作,则此规则默认为/ Home / Index。如果您想点击名为Default
的操作,您将转到/ Home / Default
如果您提供/ Home / Index / 21,它将调用Index方法 - 但如果您没有提供年龄,则会出现问题,因为您没有方法可以匹配该规则。您需要添加方法public ActionResult Index()
或使用默认值public ActionResult Index(int a = 0)
以下是一些可能违反此规则的网址示例。
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