我在ASP.Net MVC项目上使用传统路由,并希望并行启用属性路由。我创建了以下内容,但在启用属性路由时,我在传统路由上获得了404
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapMvcAttributeRoutes();
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
控制器
[RoutePrefix("Registration")]
public class RegistrationController : Controller
{
[HttpGet]
[Route("Add/{eventId}")]
public ActionResult Add(int eventId)
{
}
}
调用
http://localhost/Registration/Add/1
在致电
时工作http://localhost/Registration/Add?eventId=1
不再有效,并以 404 NotFound
作出回应答案 0 :(得分:2)
如果在路径模板
中使{eventId}
模板参数可选,则应该有效
[RoutePrefix("Registration")]
public class RegistrationController : Controller {
//GET Registration/Add/1
//GET Registration/Add?eventId=1
[HttpGet]
[Route("Add/{eventId:int?}")]
public ActionResult Add(int eventId) {
//...
}
}
两者不起作用的原因是路线模板Add/{eventId}
意味着路线只会在{eventId}
出现时匹配,这就是为什么
http://localhost/Registration/Add/1
作品。
通过设置(eventId
)可选eventid?
,它将允许
http://localhost/Registration/Add
不需要模板参数。现在,这将允许使用查询字符串?eventId=1
,路由表将使用该字符串来匹配操作上的int eventId
参数参数。
http://localhost/Registration/Add?eventId=1
答案 1 :(得分:0)
我也遇到了这个问题。您使用的是哪个MVC版本? 我在asp.net核心中遇到了MVC这个问题。 我认为这是一个缺陷,就像你在任何动作方法上提供路由属性一样,它的传统路线被过度使用并且不再可用,因此你会得到404错误。 为此,您可以为此操作方法提供另一个Route属性。这将有效
[Route("Add/{eventId}")]
[Route("Add")]