web-dev-qa-db-ja.com

ASP.NET MVC5ルーティングオプションパラメーター

特定のリンクから呼び出したいアクションがApiControllerにあるので、この単純なルートを作成しました

[Route("Rest/GetName/{name}")]
public IHttpActionResult GetName(string name) {
    // cut - code here is trivial but long, I just fill in an object to return as Json code
    return Json(myObject);
}

正常に動作しますが、パラメーターをオプションにしたいです。 documentation によると、ルートのパラメータ名の最後に質問ポイントを追加するだけで十分です。

[Route("Rest/GetName/{name?}")]

このように、オプションのパラメーターを指定しないとエラーが発生するため、

.../Rest/GetName/AnyName --> ok
.../Rest/GetName/ --> error (see below)

{"メッセージ": "リクエストURIに一致するHTTPリソースが見つかりませんでした ' https:// localhost/miApp/Rest/GetName '。"、 "MessageDetail": "アクションが見つかりませんでしたリクエストに一致するコントローラ「Rest」。 "}

8
Naigel

Web APIでは、null許容型およびクラスの場合でも、オプションの値を明示的に設定する必要があります。

オプションのパラメータにデフォルト値を使用します。

[Route("Rest/GetName/{name?}")]
public IHttpActionResult GetName(string name = null) {
    // cut - code here is trivial but long, I just fill in an object to return as Json code
    return Json(myObject);
}

そして、ルーティング登録を忘れないでください:

httpConfig.MapHttpAttributeRoutes()
16
Vadim Martynov

多くの可能な解決策があります:

  1. オプションのパラメータを試してください

       [Route("Rest/GetName/{name?}")]
       public IHttpActionResult GetName(string name = null) {
           // cut - code here        is trivial but long, I just fill in an               
           obj ect to return as 
           `enter code here`Json code
           return Json(myObject);
             }
    

2 .最初にコントローラーにPreFixを設定

    [RoutePrefix("api/Rest")]
    [Authorize]
    public class RestController : ApiController
    {
         [Route("/GetName/{name}")]
         public IHttpActionResult GetName(string name = null) 
         {
         // cut - code here is trivial but long, I just fill in an object
         to  return as Json code
         return Json(myObject);
         }
     }

3 .ルートのアクション名の前にパラメーターを書き込む

   [RoutePrefix("api/Rest")]
    [Authorize]
    public class RestController : ApiController
    {
         [Route("{name}/GetName")]
         public IHttpActionResult GetName(string name = null) 
         {
         // cut - code here is trivial but long, I just fill in an object
         to  return as Json code
         return Json(myObject);
         }
     }

うまくいけば、これはあなたがあなたの問題を解決するのに役立つでしょう。ありがとう

0
Nauman Khan