1

У меня есть ControlController с одним видом - Index.cshtml.Маршрутизация не работает при отправке запроса DELETE к действию HttpDelete

Следующие 3 способа действия внутри этого контроллера:

//http://localhost:55555/products 
[HttpGet] 
public IActionResult Index() 
{ 
} 

//http://localhost:55555/products 
[HttpPost] 
public IActionResult Index(ProductViewModel product) 
{ 
} 

//http://localhost:55555/products/1 
[HttpDelete("{id}")] 
public IActionResult Index([FromRoute] int id) 
{ 
} 

Get отлично работает, когда я иду/продуктов. Post работает отлично, когда я создаю новый продукт, используя/продукты. Удалить вообще не работает, я получаю 404, не найденный для/products/9. Я использую стандартный запрос AJAX с типом: DELETE.

Я использую обычные параметры маршрутизации по умолчанию MVC:

 routes.MapRoute(
      name: "default", 
      template: "{controller=Home}/{action=Index}/{id?}"); 

Вот что мой AJAX запрос выглядит следующим образом:

$(".js-delete-product").click(function() { 
    $.ajax({ 
     type: "DELETE", 
     url: "products/" + $(this).data("id"), 
     success: onDeleteSuccess 
    }); 
}); 

Я также попытался отправки УДАЛИТЬ запрос в почтальона http://localhost:55555/products/1 чтобы убедиться, что это не мой jquery ajax и еще 404 не найден.

UPDATE: Если я отправить запрос DELETE только http://localhost:55555/products переходит в функцию, но, как вы ожидали бы парам идентификатор присваивается нулевое значение. Любая идея, почему это происходит? Я только хочу, чтобы он перешел в метод delete, если передан параметр, но когда передан параметр, он не входит (404 не найден).

+0

Не могли бы вы попытаться отправить запрос DELETE на 'http: // localhost: 55555/products/index/1' и посмотреть, работает ли это? – rabelloo

+0

Можете ли вы разместить свой код Ajax? –

+0

@Dobbins Я обновил свой пост с помощью кода ajax. Я понятия не имею, почему это не сработает. Консоль бросает 404 не найденную ошибку и сообщает мне, что запрошенный URL-адрес: http: // localhost: 555555/products/1 –

ответ

0

Включите параметр маршрута для id на атрибуте [HttpDelete]:

[HttpDelete("{id}")] 
public IActionResult Index([FromRoute] int id) 
{ 
} 
+0

Я действительно думал, что это сработает, но это не так. –

+0

См. Обновление в нижней части сообщения. –

1

для маршрута можно отметить определенные поля в качестве факультативных и установить по умолчанию для других

routes.MapRoute(
    name: "default", 
    template: "{controller}/{action}/{id}", 
    defaults: new {controller = "Home", action = "Index", id = UrlParameter.Optional}); 

, то вы можете просто сделать

[HttpDelete] 
public IActionResult Index(int id) 
{ 
} 
+0

Я считаю, что это то же самое, что и конфигурация, указанная в моем сообщении. Поправьте меня, если я ошибаюсь. –

+0

@BlakeRivell не уверен, что тег маршрута имеет конфликт с атрибутом {id}.сделайте снимок – Steve

+0

Пожалуйста, ознакомьтесь с обновлением в нижней части сообщения. –

0

Наконец-то нашел ответ на этот вопрос, но только от проб и ошибок. Я понятия не имею, почему это работает только так.

//http://localhost:55555/products/1 

[HttpDelete("products/{id}")] 
public IActionResult Index([FromRoute] int id) 
{ 
} 

Я понятия не имею, почему я должен указать имя контроллера, как это следует уже считать основаны от этого параметра:

routes.MapRoute(
     name: "default", 
     template: "{controller=Home}/{action=Index}/{id?}"); 

Если кто-то может еще объяснить, почему это так, что было бы замечательно.

+0

Видимо, шаблон не анализируется так, как вы ожидали, поэтому вы не можете установить в нем значения по умолчанию и дополнительные параметры. Вы должны настроить его, как предложил @Steve. Вот документация MS: https://msdn.microsoft.com/en-us/library/cc668201.aspx – rabelloo