1

View-Index.cshtmlが1つのみのProductsControllerがあります。HttpDeleteアクションにDELETE要求を送信するとルーティングが機能しない

次の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) 
{ 
} 

取得は完全に正常に動作します。 /製品を使用して新しい製品を作成すると、Postは完璧に機能します。削除がまったく機能しない、/ products/9の404が見つかりません。私は標準のAJAXリクエストw/type:DELETEを使用しています。

私はデフォルトMVC従来のルーティング設定を使用しています:私もhttp://localhost:55555/products/1に郵便配達中にDELETEリクエストを送信しようとした

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

:ここ

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

は次のように私のAjaxリクエストが見えるものです私のjquery ajaxではないことを確認し、まだ404は見つかりませんでした。

UPDATE: 私はちょうどhttp://localhost:55555/products DELETEリクエストを送信した場合、それは機能になりますが、あなたが期待するようのidのparamがnullに設定されています。なぜこれが起こっているのか?私はparamが渡された場合にのみdeleteメソッドに移りますが、paramが渡されると(404 not found)入りません。

+0

'http:// localhost:55555/products/index/1'にDELETEリクエストを送信して、それが動作するかどうか確認してください。 – rabelloo

+0

あなたのAjaxコードを投稿できますか? –

+0

@Dobbins私はajaxコードで投稿を更新しました。なぜそれがうまくいかないのか分かりません。コンソールに404エラーが表示され、要求されたURLがhttp:// localhost:555555/products/1 –

答えて

0

[HttpDelete]属性のidのルートパラメータを含める:ルートの

[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 fromルートタグが{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

関連する問題