MVC常规和属性路由不能一起工作

时间:2018-04-28 22:07:19

标签: c# asp.net-mvc asp.net-mvc-routing attributerouting

我在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

作出回应

2 个答案:

答案 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")]