How to pass multiple parameters to a get method in ASP.NET Core

前端 未结 12 1292
说谎
说谎 2020-12-04 07:46

How can I pass in multiple parameters to Get methods in an MVC 6 controller. For example I want to be able to have something like the following.

[Route(\"api         


        
相关标签:
12条回答
  • 2020-12-04 07:58

    NB-I removed FromURI .Still I can pass value from URL and get result.If anyone knows benfifts using fromuri let me know

    0 讨论(0)
  • 2020-12-04 08:05

    To parse the search parameters from the URL, you need to annotate the controller method parameters with [FromQuery], for example:

    [Route("api/person")]
    public class PersonController : Controller
    {
        [HttpGet]
        public string GetById([FromQuery]int id)
        {
    
        }
    
        [HttpGet]
        public string GetByName([FromQuery]string firstName, [FromQuery]string lastName)
        {
    
        }
    
        [HttpGet]
        public string GetByNameAndAddress([FromQuery]string firstName, [FromQuery]string lastName, [FromQuery]string address)
        {
    
        }
    }
    
    0 讨论(0)
  • 2020-12-04 08:05

    I think the easiest way is to simply use AttributeRouting.

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
        public string Get(int paramOne, int paramTwo)
        {
            return "The [Route] with multiple params worked";
        }
    
    0 讨论(0)
  • 2020-12-04 08:06

    I would suggest to use a separate dto object as an argument:

    [Route("api/[controller]")]
    public class PersonController : Controller
    {
        public string Get([FromQuery] GetPersonQueryObject request)
        {
            // Your code goes here
        }
    }
    
    public class GetPersonQueryObject 
    {
        public int? Id { get; set; }
        public string Firstname { get; set; }
        public string Lastname { get; set; }
        public string Address { get; set; }
    }
    

    Dotnet will map the fields to your object.

    This will make it a lot easier to pass through your parameters and will result in much clearer code.

    0 讨论(0)
  • 2020-12-04 08:09

    To add some more detail about the overloading that you asked about in your comment after another answer, here is a summary. The comments in the ApiController show which action will be called with each GET query:

    public class ValuesController : ApiController
    {
        // EXPLANATION: See the view for the buttons which call these WebApi actions. For WebApi controllers, 
        //          there can only be one action for a given HTTP verb (GET, POST, etc) which has the same method signature, (even if the param names differ) so
        //          you can't have Get(string height) and Get(string width), but you can have Get(int height) and Get(string width).
        //          It isn't a particularly good idea to do that, but it is true. The key names in the query string must match the
        //          parameter names in the action, and the match is NOT case sensitive. This demo app allows you to test each of these
        //          rules, as follows:
        // 
        // When you send an HTTP GET request with no parameters (/api/values) then the Get() action will be called.
        // When you send an HTTP GET request with a height parameter (/api/values?height=5) then the Get(int height) action will be called.
        // When you send an HTTP GET request with a width parameter (/api/values?width=8) then the Get(string width) action will be called.
        // When you send an HTTP GET request with height and width parameters (/api/values?height=3&width=7) then the 
        //          Get(string height, string width) action will be called.
        // When you send an HTTP GET request with a depth parameter (/api/values?depth=2) then the Get() action will be called
        //          and the depth parameter will be obtained from Request.GetQueryNameValuePairs().
        // When you send an HTTP GET request with height and depth parameters (/api/values?height=4&depth=5) then the Get(int height) 
        //          action will be called, and the depth parameter would need to be obtained from Request.GetQueryNameValuePairs().
        // When you send an HTTP GET request with width and depth parameters (/api/values?width=3&depth=5) then the Get(string width) 
        //          action will be called, and the depth parameter would need to be obtained from Request.GetQueryNameValuePairs().
        // When you send an HTTP GET request with height, width and depth parameters (/api/values?height=7&width=2&depth=9) then the 
        //          Get(string height, string width) action will be called, and the depth parameter would need to be obtained from 
        //          Request.GetQueryNameValuePairs().
        // When you send an HTTP GET request with a width parameter, but with the first letter of the parameter capitalized (/api/values?Width=8) 
        //          then the Get(string width) action will be called because the case does NOT matter.
        // NOTE: If you were to uncomment the Get(string height) action below, then you would get an error about there already being  
        //          a member named Get with the same parameter types. The same goes for Get(int id).
        //
        // ANOTHER NOTE: Using the nullable operator (e.g. string? paramName) you can make optional parameters. It would work better to
        //          demonstrate this in another ApiController, since using nullable params and having a lot of signatures is a recipe
        //          for confusion.
    
        // GET api/values
        public IEnumerable<string> Get()
        {
            return Request.GetQueryNameValuePairs().Select(pair => "Get() => " + pair.Key + ": " + pair.Value);
            //return new string[] { "value1", "value2" };
        }
    
        //// GET api/values/5
        //public IEnumerable<string> Get(int id)
        //{
        //    return new string[] { "Get(height) => height: " + id };
        //}
    
        // GET api/values?height=5
        public IEnumerable<string> Get(int height) // int id)
        {
            return new string[] { "Get(height) => height: " + height };
        }
    
        // GET api/values?height=3
        public IEnumerable<string> Get(string height)
        {
            return new string[] { "Get(height) => height: " + height };
        }
    
        //// GET api/values?width=3
        //public IEnumerable<string> Get(string width)
        //{
        //    return new string[] { "Get(width) => width: " + width };
        //}
    
        // GET api/values?height=4&width=3
        public IEnumerable<string> Get(string height, string width)
        {
            return new string[] { "Get(height, width) => height: " + height + ", width: " + width };
        }
    }
    

    You would only need a single route for this, in case you wondered:

        config.Routes.MapHttpRoute(
            name: "DefaultApi",
            routeTemplate: "api/{controller}/{id}",
            defaults: new { id = RouteParameter.Optional }
        );
    

    and you could test it all with this MVC view, or something simlar. Yes, I know you aren't supposed to mix JavaScript with markup and I'm not using bootstrap like you would normally, but this is for demo purposes only.

    <div class="jumbotron">
        <h1>Multiple parameters test</h1>
        <p class="lead">Click a link below, which will send an HTTP GET request with parameters to a WebAPI controller.</p>
    </div>
    <script language="javascript">
        function passNothing() {
            $.get("/api/values", function (data) { alert(data); });
        }
    
        function passHeight(height) {
            $.get("/api/values?height=" + height, function (data) { alert(data); });
        }
    
        function passWidth(width) {
            $.get("/api/values?width=" + width, function (data) { alert(data); });
        }
    
        function passHeightAndWidth(height, width) {
            $.get("/api/values?height=" + height + "&width=" + width, function (data) { alert(data); });
        }
    
        function passDepth(depth) {
            $.get("/api/values?depth=" + depth, function (data) { alert(data); });
        }
    
        function passHeightAndDepth(height, depth) {
            $.get("/api/values?height=" + height + "&depth=" + depth, function (data) { alert(data); });
        }
    
        function passWidthAndDepth(width, depth) {
            $.get("/api/values?width=" + width + "&depth=" + depth, function (data) { alert(data); });
        }
    
        function passHeightWidthAndDepth(height, width, depth) {
            $.get("/api/values?height=" + height + "&width=" + width + "&depth=" + depth, function (data) { alert(data); });
        }
    
        function passWidthWithPascalCase(width) {
            $.get("/api/values?Width=" + width, function (data) { alert(data); });
        }
    </script>
    <div class="row">
        <button class="btn" onclick="passNothing();">Pass Nothing</button>
        <button class="btn" onclick="passHeight(5);">Pass Height of 5</button>
        <button class="btn" onclick="passWidth(8);">Pass Width of 8</button>
        <button class="btn" onclick="passHeightAndWidth(3, 7);">Pass Height of 3 and Width of 7</button>
        <button class="btn" onclick="passDepth(2);">Pass Depth of 2</button>
        <button class="btn" onclick="passHeightAndDepth(4, 5);">Pass Height of 4 and Depth of 5</button>
        <button class="btn" onclick="passWidthAndDepth(3, 5);">Pass Width of 3 and Depth of 5</button>
        <button class="btn" onclick="passHeightWidthAndDepth(7, 2, 9);">Pass Height of 7, Width of 2 and Depth of 9</button>
        <button class="btn" onclick="passHeightWidthAndDepth(7, 2, 9);">Pass Height of 7, Width of 2 and Depth of 9</button>
        <button class="btn" onclick="passWidthWithPascalCase(8);">Pass Width of 8, but with Pascal case</button>
    </div>
    
    0 讨论(0)
  • 2020-12-04 08:11
        public HttpResponseMessage Get(int id,string numb)
        {
    
            using (MarketEntities entities = new MarketEntities())
            {
              var ent=  entities.Api_For_Test.FirstOrDefault(e => e.ID == id && e.IDNO.ToString()== numb);
                if (ent != null)
                {
                    return Request.CreateResponse(HttpStatusCode.OK, ent);
                }
                else
                {
                    return Request.CreateErrorResponse(HttpStatusCode.NotFound, "Applicant with ID " + id.ToString() + " not found in the system");
                }
            }
        }
    
    0 讨论(0)
提交回复
热议问题