2017-10-16 9 views
-1

私は同様の質問hereを少し前に聞いたことがありますが、私は達成しようとしています。私はもう一度やり直して、もう少し説明しようとしています!ASP.NET Core 2.0のGETおよびPOSTアクションへのデフォルトルートを維持しながらアクションルーティングを処理する最も簡潔な方法MVC

私はこのすべて(現在は)いくつかのバリエーションある多数のコントローラとASP.NETコア2.0のWeb APIプロジェクトがあります。

[Route("api/[controller]")] 
public class ExampleController : Controller 
{ 
    [HttpGet] 
    public MyType Get() => GetMyTypeFromSomewhere(); 

    [HttpPost] 
    public void Post([FromBody]updated) => UpdateMyType(updated); 

    [HttpGet("[action]")] 
    public void SelectedOption() => Options.GetSelectedOption(); 

    [HttpPost("[action]")] 
    public void SelectOption([FromBody]int id) => Options.SelectOption(id); 

    [HttpDelete("[action]")] 
    public void DeleteOption([FromBody]Guid id) => Options.DeleteOption(id); 
} 

あなたはおそらくも、この単純な例からもわかるように、それは非常に迷惑なんですすべてのコントローラーの上部に[Route("api/[controller]")]を含める必要があります。また、デフォルト以外のすべてのアクションのというHttp 属性に("[action]")を含める必要があります。

指定されたアクションがないリクエストに対しては、デフォルトのルーティングをGet()Post()にすることができますが、指定されたときには他のアクションにルーティングして、すべてのコントローラとメソッドをマークする必要はありません同じ気分で

たとえば:インスタンスを取る必要があります

  • GET mysite.com/api/Example
    ががMyType
  • POST mysite.com/api/Example
    のインスタンスを返す必要がありますMyType
  • GET mysite.com/api/Example/SelectedOption
    はint型
を取る必要がありますint型
  • POST mysite.com/api/Example/SelectOption
    がint
  • DELETE mysite.com/api/Example/DeleteOption
    を取る必要があります返す必要があります

    MapRouteとコントローラとメソッドの装飾の種類がさまざまですが、実際には("[action]")ですべてをマークする代替方法は見つかりませんでした。 app.addMvcMapRouteを使用して

    は私が{action}を指定した場合、私のリクエストの最後にか/ポストを取得/ を追加せずに、私は()を取得達することができないとポスト()ので動作しません(あり{action?}との違いはありません)。
    私が得た最も近いものは{action=Get}で、これはデフォルトでGETメソッドにルーティングされますが、デフォルトのPOSTメソッドに到達する能力はありません。

    これも可能ですか?その場合は誰でも知っていますか?

  • +0

    :ここ

    は、Idは、あなたのコントローラーを書く方法です。 [This](https://weblogs.asp.net/imranbaloch/custom-routing-aspnet5-mvc6)は、まともなスタート地点のようです。 – Jonesopolis

    +0

    値を更新する冪等のメソッドには、PUTを使用する必要があります。 POSTは値を追加するためのものです。 –

    答えて

    -1

    私はそれがルート上のアクションを削除するだけの問題だと思います。次のように:

    routes.MapRoute("default", "api/{controller=Values}/{id?}");

    はそれが役に立てば幸い!

    -1

    ルーティングの方が良いアプローチであるとは思わないでしょうか?

    など。クラスレベルで[Route( "api/example")]を宣言してから、あなたの動詞を[HttpGet]などの関連属性を使って動詞にすることができます。

    -1

    私はいつもルート属性をクラスに追加します。そこから、私はデフォルトルートを使ってルートを注文します(注文事項)。 私はまた、適切なアクションの要求をサンゴ礁に役立つために制約を使用します。 デフォルト以外のGetメソッドとPostメソッドがちょっと奇妙です。現在どのように設定しているのでしょうか?100%はデフォルト以外のGetアクションの属性でアクションを指定する必要があります。

    postメソッドからオプションを返すだけでいいですか? 私は通常、アクション名(可能な場合)を使用することを避けたいのですが、これはAPIを使いやすくするためです。

    とにかく、達成しようとしていることを誤解してしまった場合は、申し訳ありません。私はあなたがあなた自身のルーティングシステムを使用して、それを実装することができます確信しているのに、私はこれは箱の外に可能であるとは思わない

    [Route("api/[controller]")] 
    public class ExampleController : Controller 
    { 
        [HttpGet] 
        public MyType Get() => GetMyTypeFromSomewhere(); 
    
        [HttpPost("{id:int}") 
        public IActionResult SelectOption(int id) 
        { 
         Options.SelectOption(id); 
         var option = Options.GetSelectedOption(); 
         return Ok(option); 
        } 
    
        [HttpGet("[action]")] 
        public IActionResult SelectedOption() 
        { 
         var option = Options.GetSelectedOption(); 
         return Ok(option); 
        } 
    
        [HttpPost] 
        public void Post([FromBody]updated) => UpdateMyType(updated); 
    
        [HttpDelete("{id:guid}") 
        public void DeleteOption(Guid id) => Options.DeleteOption(id); 
    } 
    
    +0

    ダウン投票者が投票した理由についてコメントしてもらえますか?理由を説明して投票しないでください。 – WBuck

    +0

    OPはコントローラ上で属性( 'RouteAttribute'、' HttpGet'、 'HttpPost')を使わずにルーティング規約を達成したいと考えています。属性を使用している回答を指定しました。 –

    +0

    @AlexWiese私は、すべてのアクション(彼が求めているもの)に[アクション]を使用する可能性のある選択肢を彼に与えました。 – WBuck

    関連する問題