Обычная и атрибутная маршрутизация MVC не работают вместе - PullRequest
0 голосов
/ 29 апреля 2018

Я использую обычную маршрутизацию в проекте 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)
    {
    }
}

Calling

http://localhost/Registration/Add/1

Работает, при звонке

http://localhost/Registration/Add?eventId=1

Больше не работает и отвечает 404 NotFound

Ответы [ 2 ]

0 голосов
/ 29 апреля 2018

Я тоже получил эту проблему. Какую версию MVC вы используете? Я столкнулся с этой проблемой с MVC в ядре asp.net. Я думаю, что это недостаток, так как если вы предоставляете атрибут Routing для любого метода действия, его обычный маршрут перегружен и больше не доступен, поэтому вы получаете ошибку 404. Чтобы это работало, вы можете предоставить другой атрибут Route для вашего метода действия, как этот. Это будет работать

 [Route("Add/{eventId}")]  
 [Route("Add")]
0 голосов
/ 29 апреля 2018

Должно работать, если вы сделаете необязательным параметр шаблона {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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...