简体   繁体   中英

ASP.NET MVC 5 routing optional parameters

I've an Action in my ApiController that I want to invoke from a specific link, so I created this simple route

[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);
}

It works fine but I want to make the parameter optional. According to documentation adding a question point at the end of the parameter name in the route should be enough

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

This way I get an error if I don't provide the optional parameter, so

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

{"Message":"No HTTP resource was found that matches the request URI ' https://localhost/miApp/Rest/GetName '.","MessageDetail":"No action was found on the controller 'Rest' that matches the request."}

Web API requires to explicitly set optional values even for nullable types and classes.

Use default value to optional parameter:

[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);
}

And don't forget about routing registration:

httpConfig.MapHttpAttributeRoutes()

There are many possible solutions:

  1. Try Optional Parameter

      [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. Set PreFix on controller first

    [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. Write parameter before action name in route

   [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);
         }
     }

Hopefully this will help you to resolve your problem.Thanks

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM