কীভাবে একাধিক পরামিতি ASP.NET কোর এ পাওয়ার পদ্ধতিতে পাস করবেন


116

এমভিসি 6 নিয়ামক পদ্ধতিতে কীভাবে আমি একাধিক পরামিতিগুলিতে পাস করতে পারি। উদাহরণস্বরূপ, আমি নীচের মতো কিছু করতে সক্ষম হতে চাই।

[Route("api/[controller]")]
public class PersonController : Controller
{
    public string Get(int id)
    {
    }

    public string Get(string firstName, string lastName)
    {

    }

    public string Get(string firstName, string lastName, string address)
    {

    }
}

সুতরাং আমি মত জিজ্ঞাসা করতে পারেন।

api/person?id=1
api/person?firstName=john&lastName=doe
api/person?firstName=john&lastName=doe&address=streetA

উত্তর:


107

আপনি এটি ব্যবহার করতে পারেন:

// GET api/user/firstname/lastname/address
[HttpGet("{firstName}/{lastName}/{address}")]
public string GetQuery(string id, string firstName, string lastName, string address)
{
    return $"{firstName}:{lastName}:{address}";
}

দ্রষ্টব্য : দয়া করে ধাতবহার্ট এবং metalheartএবং Mark Hughesসম্ভবত আরও ভাল পদ্ধতির জন্য দেখুন।


23
যতক্ষণ না আপনি প্রত্যেককে একই পদবি দিয়ে পাওয়ার দরকার :)
ফিলিপ কোপলি

18
এটি এপিআই রুটগুলি ডিজাইন করার জন্য খুব খারাপ উপায় ... মোটেই বিশ্রাম নয়।
থমাস লেভেস্ক

8
উপরোক্ত পদ্ধতিরটি দেখতে খুব জটিল মনে হচ্ছে, কেন এটির অনেকগুলি উত্সাহ রয়েছে get
বার্নোল্লি IT

4
@ থমাস লেভসেক এতে বিশ্রাম না পেয়ে আপনি কী বোঝাতে চেয়েছেন?
ব্রুনো সান্টোস

4
@ ব্রুনোসান্টোস এটি রেস্টের নীতি অনুসরণ করে না। ইউআরআইগুলি অনন্যভাবে সংস্থানগুলি সনাক্ত করার কথা। এখানে বিষয়টি নয় (একই প্রথম এবং শেষ নাম সহ একাধিক ব্যক্তি থাকতে পারে এবং কোনও ঠিকানা অবশ্যই সনাক্তকারী হিসাবে বিবেচনা করা যায় না)
টমাস লেভস্ক

64

কেন কেবল একটি নিয়ামক পদক্ষেপ ব্যবহার করছেন না?

public string Get(int? id, string firstName, string lastName, string address)
{
   if (id.HasValue)
      GetById(id);
   else if (string.IsNullOrEmpty(address))
      GetByName(firstName, lastName);
   else
      GetByNameAddress(firstName, lastName, address);
}

অন্য বিকল্পটি হল অ্যাট্রিবিউট রাউটিং ব্যবহার করা, তবে তারপরে আপনার আলাদা ইউআরএল ফর্ম্যাট থাকা দরকার:

//api/person/byId?id=1
[HttpGet("byId")] 
public string Get(int id)
{
}

//api/person/byName?firstName=a&lastName=b
[HttpGet("byName")]
public string Get(string firstName, string lastName, string address)
{
}

হ্যাঁ, আমি এখন এটির সমাধান করে আমি একটি ব্যক্তির সন্ধান করতে সক্ষম হতে চাই এমন সমস্ত বৈশিষ্ট্য গ্রহণ করে একটি ক্রিয়া ব্যবহার করে। সাধারণ অনুসন্ধানের মতো। আমি যদি পছন্দ করি তবে সেখানে যদি কোনও নিয়ামকটিতে অতিরিক্ত লোড ক্রিয়াকলাপ করার উপায় থাকে তবে সেটি নাও হতে পারে।
mstrand

4
এটি। নেট কোর 2.0 এর সাথে কাজ করে না, যেহেতু কোনও বৈধ url টেমপ্লেট আসলে জেনারেট হয় না।
জেডজেড

45

ইউআরএল থেকে অনুসন্ধানের প্যারামিটারগুলি বিশ্লেষণের জন্য, আপনাকে কন্ট্রোলার পদ্ধতির পরামিতিগুলির সাথে এ্যানোটেট করতে হবে [FromQuery], উদাহরণস্বরূপ:

[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)
    {

    }
}

7
আপনি এই প্রয়োজন হবে কেন? ক্যোয়ারী স্ট্রিং থেকে প্যারামিটার বাইন্ডিং ডিফল্ট হিসাবে ঘটে ...
ধাতবশালী

4
[ফোরকিউয়ারি] বা ছাড়াই ব্যর্থ হওয়ার চেষ্টা করার সাথে সাথে আমি উভয়ই ওভারলোডিংয়ের চেষ্টা করেছি
মস্ট্র্যান্ড

4
@ এমস্ট্র্যান্ড আমি আপডেট করেছি - একবার যান, অতিরিক্ত [HttpGet]টীকাগুলি, বিভিন্ন পদ্ধতির নাম এবং এর মধ্যে নির্দিষ্ট [Route]রুটগুলি দেখুন - রুটগুলি এখন পুরোপুরি সুস্পষ্ট হওয়া উচিত যা কয়েকটি সম্ভাব্য সমস্যাগুলি দূর করে।
মার্ক হিউজ

13

আমি আর্গুমেন্ট হিসাবে একটি পৃথক ডিটিও অবজেক্টটি ব্যবহার করার পরামর্শ দেব:

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

ডটনেট আপনার বস্তুতে ক্ষেত্রগুলি ম্যাপ করবে।

এটি আপনার পরামিতিগুলির মধ্য দিয়ে যাওয়া অনেক সহজ করে দেবে এবং এর ফলে আরও পরিষ্কার কোড হবে।


10

আমি মনে করি সহজ উপায়টি সহজভাবে ব্যবহার করা AttributeRouting

[Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
    public string Get(int paramOne, int paramTwo)
    {
        return "The [Route] with multiple params worked";
    }

আমি কি পছন্দসই রেফারেন্স টাইপ ব্যবহার করতে পারি? এটি হ'ল,int paramOne, string paramTwo
এস

[দ্বিতীয় রুটটি ব্যবহার করুন ("এপিআই / আপনার কন্ট্রোলার / {প্যারামওন} / m প্যারামটুই?}")]] আপনি যদি নিজের দ্বিতীয় প্যারামিটারটি
beচ্ছিক

7

ওয়েব এপিআই কোরটিতে একাধিক প্যারামিটারের সাথে কল করতে

  [ApiController]
    [Route("[controller]")]
    public class testController : Controller
    {

      [HttpGet]
        [Route("testaction/{id:int}/{startdate}/{enddate}")]
        public IEnumerable<classname> test_action(int id, string startdate, string enddate)
        {

            return List_classobject;
        }

    }

In web browser
https://localhost:44338/test/testaction/3/2010-09-30/2012-05-01

4

পদ্ধতিগুলি এর মতো হওয়া উচিত:

[Route("api/[controller]")]
public class PersonsController : Controller
{
    [HttpGet("{id}")]
    public Person Get(int id)

    [HttpGet]
    public Person[] Get([FromQuery] string firstName, [FromQuery] string lastName, [FromQuery] string address)
}

নোট করুন যে দ্বিতীয় পদ্ধতিটি অবজেক্টগুলির একটি অ্যারে প্রদান করে এবং নিয়ামকের নামটি বহুবর্ণে থাকে (ব্যক্তি না ব্যক্তি)।

সুতরাং আপনি যদি আইডির মাধ্যমে সংস্থান পেতে চান তবে তা হ'ল:

api/persons/1

আপনি যদি প্রথম নাম এবং ইত্যাদির মতো কিছু অনুসন্ধানের মানদণ্ডে অবজেক্টগুলি নিতে চান তবে আপনি এটির মতো অনুসন্ধান করতে পারেন:

api/persons?firstName=Name&...

এবং আপনি যদি সেই ব্যক্তির আদেশ নিতে চান (যেমন উদাহরণস্বরূপ) এগিয়ে যেতে চান তবে এটি এমন হওয়া উচিত:

api/persons/1/orders?skip=0&take=20

এবং একই নিয়ামক পদ্ধতি:

    [HttpGet("{personId}/orders")]
    public Orders[] Get(int personId, int skip, int take, etc..)

3

আপনি অন্য উত্তরের পরে আপনার মন্তব্যে যে ওভারলোডিং সম্পর্কে জিজ্ঞাসা করেছিলেন সে সম্পর্কে আরও কিছু বিশদ যুক্ত করতে এখানে একটি সংক্ষিপ্তসার দেওয়া হল। ApiControllerপ্রতিটি GETপ্রশ্নের সাথে কোন ক্রিয়াকলাপটি প্রদর্শন করা হবে তা শোতে দেওয়া মন্তব্যগুলি :

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

আপনি যদি ভেবে থাকেন তবে এর জন্য আপনার কেবলমাত্র একটি একক রুটের প্রয়োজন হবে:

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

এবং আপনি এই এমভিসি ভিউ, বা সিমলার কিছু দিয়ে পরীক্ষা করতে পারেন। হ্যাঁ, আমি জানি যে আপনি মার্কআপের সাথে জাভাস্ক্রিপ্ট মিশ্রিত করবেন না এবং আপনি সাধারণত বুটস্ট্র্যাপ ব্যবহার করেন না তবে এটি কেবল ডেমো উদ্দেশ্যে purposes

<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>

2

সহজতম উপায়,

নিয়ামক:

[HttpGet("empId={empId}&startDate={startDate}&endDate={endDate}")]
 public IEnumerable<Validate> Get(int empId, string startDate, string endDate){}

পোস্টম্যানের অনুরোধ:

{router}/empId=1&startDate=2020-20-20&endDate=2020-20-20

শেখার পয়েন্ট: অনুরোধের সঠিক প্যাটার্নটি নিয়ামক স্বীকার করবেন।


1

এখানে চিত্র বর্ণনা লিখুন

এনবি-আমি ফুরুরিটি সরিয়ে ফেললাম। তবুও আমি ইউআরএল থেকে মানটি পাস করতে পারি এবং ফলাফল পেতে পারি anyoneআর কেউ যদি বেনফিটগুলি জেনে থাকে তবে থানুরি ব্যবহার করে আমাকে জানান


প্যারামিটার বাইন্ডিংয়ের জন্য ডকুমেন্টেশনে বর্ণিত [1] সাধারণ প্রকারের জন্য, "(ইনট, বুল, ডাবল, এবং আরও এগিয়ে), এবং টাইমস্প্যান, ডেটটাইম, গাইড, দশমিক, এবং স্ট্রিং" স্বয়ংক্রিয়ভাবে ইউআরআই থেকে পড়া হবে। যখন ইউআরআই থেকে তাদের ডিফল্ট অবস্থান, শরীরের চেয়ে পড়তে বাধ্য করা না হয় তবে এই ধরণের কোনও একটিতে প্যারামিটারের জন্য [FromURI] বৈশিষ্ট্যটি আবশ্যক। সম্পূর্ণতার জন্য [ফ্রমবিডি] গুণাবলী জটিল ধরণের সাথে মূলত বিপরীত হয়। [1] ডকস.মাইক্রোসফট.এইন.ইউএস / এস্পনেট / ওয়েবে- এপি / ওভারভিউ/… )
সেব আন্দ্রোস

1

আপনি কেবল নিম্নলিখিতটি করতে পারেন:

    [HttpGet]
    public async Task<IActionResult> GetAsync()
    {
        string queryString = Request.QueryString.ToString().ToLower();

        return Ok(await DoMagic.GetAuthorizationTokenAsync(new Uri($"https://someurl.com/token-endpoint{queryString}")));
    }

আপনার যদি প্রতিটি উপাদান পৃথকভাবে অ্যাক্সেস করার প্রয়োজন হয় তবে কেবল উল্লেখ করুন Request.Query


0
    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");
            }
        }
    }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.