কীভাবে এএসপি.নেট কোরের সাথে ক্যোয়ারিংয়ের মানগুলি পড়বেন?


135

আমি এএসপি.নেট কোর এমভিসি ব্যবহার করে একটি আরএসএসএফুল এপিআই তৈরি করছি এবং আমি কোনও সংস্থানে ফিরে আসা সংস্থার উপর ফিল্টারিং এবং পেজিং নির্দিষ্ট করতে ক্যোরিস্ট্রিং প্যারামিটার ব্যবহার করতে চাই।

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

আমি ইতিমধ্যে সনাক্ত করেছি যে কন্ট্রোলারের ভিতরে Getঅ্যাক্সেস অ্যাক্সেস HttpContext.Request.Queryএক দেয় IQueryCollection

সমস্যাটি হ'ল আমি জানি না যে এটি কীভাবে মানগুলি পুনরুদ্ধার করতে ব্যবহৃত হয়। সত্য সত্যই, আমি ভেবেছিলাম উপায়টি ব্যবহার করে, উদাহরণস্বরূপ

string page = HttpContext.Request.Query["page"]

সমস্যাটি হ'ল HttpContext.Request.Query["page"]কোনও স্ট্রিং ফিরে আসে না, তবে একটি StringValues

যাইহোক, কেউ কীভাবে IQueryCollectionবাস্তবে ক্যোরিস্ট্রিংয়ের মানগুলি পড়তে ব্যবহার করে ?


1
আমি এখানে একটি পোস্ট লিখেছিলাম যা আপনি এখানে পেতে পারেন: neelbutt40.wordpress.com/2017/07/06/…
নীল

উত্তর:


134

আপনি [FromQuery]ক্যোয়ারস্ট্রিংয়ে কোনও নির্দিষ্ট মডেলকে বাঁধতে ব্যবহার করতে পারেন :

https://docs.microsoft.com/en-us/aspnet/core/mvc/models/model-binding

যেমন

[HttpGet()]
public IActionResult Get([FromQuery(Name = "page")] string page)
{...}

5
আমি মনে করি যে [FromQuery]। নেট বাঁধাই ডিফল্টরূপে সমস্ত ফর্ম ইনপুট এবং ইউআরএল কোয়েরিস্ট্রিং প্যারামগুলি পরীক্ষা করবে, কারণ আপনার উত্সটি সীমাবদ্ধ করার কোনও কারণ নেই the
এস। সরপুশন

12
(নাম = "পৃষ্ঠা") অপ্রয়োজনীয় - এটির নাম দেওয়া থাকলে এটি চলকের সাথে আবদ্ধ হবে
a3uge

ক্যোরিস্ট্রিং প্যারামিটারের নামটি কাঠামোগত করা থাকলে এটি গুরুত্বপূর্ণ। উদাহরণস্বরূপ 'অবজেক্ট.প্রপাম'
জোসে

96

আপনি টোস্ট্রিং পদ্ধতিটি ব্যবহার করতে পারেন যার ভিত্তিতে IQueryCollectionযদি একটি একক pageপ্যারামিটার নির্দিষ্ট করা থাকে তবে পছন্দসই মানটি ফিরে আসবে :

string page = HttpContext.Request.Query["page"].ToString();

যদি এখানে একাধিক মান থাকে ?page=1&page=2তবে টসস্ট্রিং কলের ফলাফল হবে1,2

তবে @ মাইক-জি তার উত্তরে প্রস্তাবিত হিসাবে আপনি আরও ভালভাবে মডেল বাইন্ডিং ব্যবহার করতে পারবেন এবং সরাসরি HttpContext.Request.Queryঅবজেক্টটিতে অ্যাক্সেস না করে ।


6
টসস্ট্রিং প্রয়োজনীয় নয়। সংকলকটি এটিকে স্পষ্টতই নিক্ষেপ করবে, যদি আপনি কোনও স্ট্রিংয়ের জন্য ক্যোয়ারী-মান নির্ধারণ করেন ..
স্টিফান স্টিগার

26

ASP.NET কোর স্বয়ংক্রিয়ভাবে বাঁধবে form values, route valuesএবং query stringsনাম ধরে। এর অর্থ আপনি কেবল এটি করতে পারেন:

[HttpGet()]
public IActionResult Get(int page)
{ ... }

এমভিসি ক্রিয়া প্যারামিটারগুলিকে নামের সাথে অনুরোধের ডেটা বেঁধে দেওয়ার চেষ্টা করবে ... নীচে সেই তথ্য উত্সগুলির একটি তালিকা রয়েছে যাতে মডেল বাইন্ডিং তাদের মাধ্যমে দেখায়

  1. Form values: এইগুলি ফর্মের মান যা পোষ্ট পদ্ধতিটি ব্যবহার করে HTTP অনুরোধে চলে। (jQuery পোষ্ট অনুরোধ সহ)

  2. Route values: রাউটিং দ্বারা সরবরাহিত রুটের মানগুলির সেট

  3. Query strings: ক্যোয়ারী স্ট্রিং অংশটি ইউআরআই।

উত্স: মডেল বাঁধাই কীভাবে কাজ করে


এফওয়াইআই, আপনি স্বয়ংক্রিয় এবং সুস্পষ্ট পদ্ধতির সমন্বয় করতে পারেন:

[HttpGet()]
public IActionResult Get(int page
     , [FromQuery(Name = "page-size")] int pageSize)
{ ... }

20

আপনি কেবল এটির মতো একটি বিষয় তৈরি করতে পারেন:

public class SomeQuery
{
    public string SomeParameter { get; set; }
    public int? SomeParameter2 { get; set; }
}

এবং তারপরে নিয়ামক ঠিক এর মতো কিছু করুন:

[HttpGet]
public IActionResult FindSomething([FromQuery] SomeQuery query)
{
    // Your implementation goes here..
}

আরও ভাল, আপনি এপিআই মডেল তৈরি করতে পারেন:

[HttpGet]
public IActionResult GetSomething([FromRoute] int someId, [FromQuery] SomeQuery query)

প্রতি:

[HttpGet]
public IActionResult GetSomething(ApiModel model)

public class ApiModel
{
    [FromRoute]
    public int SomeId { get; set; }
    [FromQuery]
    public string SomeParameter { get; set; }
    [FromQuery]
    public int? SomeParameter2 { get; set; }
}

এটি প্রয়োগ করতে পারে এমন একটি URL কী? আমি এটিতে নতুন তাই আমি ইউআরএলটিতে "পিছনে ইঞ্জিনিয়ার" রাখতে পারি না। এটি উদাহরণের মতো কিছু হবে ?
খ্রিস্টান


19

এখানে আমি ব্যবহার করেছি একটি কোড নমুনা (একটি। নেট কোর দেখুন সহ):

@{
    Microsoft.Extensions.Primitives.StringValues queryVal;

    if (Context.Request.Query.TryGetValue("yourKey", out queryVal) &&
        queryVal.FirstOrDefault() == "yourValue")
    {
    }
}

2
সম্পূর্ণ অবজেক্টের নাম (বা সঠিক ব্যবহারের বিবৃতি) অন্তর্ভুক্ত করার জন্য আপভোট করুন। লোকেরা পুরোপুরি যোগ্যতাসম্পন্ন বা কমপক্ষে কোনও ব্যবহারের বিবৃতি না দিয়ে কেবল অবজেক্টের নাম রাখলে আমাকে বাদ দেয়। ধন্যবাদ।
গ্রানাডা কোডার

11

StringValuesস্ট্রিংগুলির একটি অ্যারে । আপনি যেমন একটি সূচক সরবরাহ করে আপনার স্ট্রিংয়ের মান পেতে পারেন HttpContext.Request.Query["page"][0]


1
ধন্যবাদ; এটিই কেবলমাত্র প্রতিক্রিয়া যা আসলে প্রশ্নের উত্তর দিয়েছিল। (আমার ক্ষেত্রে, আমি বাইন্ডিংটি ব্যবহার করতে পারি না কারণ আমার কাছে আরও প্রথম জটিল জিজ্ঞাসা যেমন "ক্যোয়ারী স্ট্রিংটি চেষ্টা করে দেখুন, যদি এটি সেশনটি ব্যবহার করে অনুপস্থিত থাকেন তবে"।)
মার্সেল পোপেস্কু

7

IQueryCollectionএকটি আছে TryGetValue()এটিতে যে আয় দেওয়া কী দিয়ে একটি মান। সুতরাং, যদি আপনার কাছে একটি কোয়েরি প্যারামিটার কল করা থাকে তবে আপনি someIntএটি এটির মতো ব্যবহার করতে পারেন:

var queryString = httpContext.Request.Query;
StringValues someInt;
queryString.TryGetValue("someInt", out someInt);
var daRealInt = int.Parse(someInt);

লক্ষ্য করুন যে আপনার যদি একই নামের একাধিক প্যারামিটার StringValuesনা থাকে তবে টাইপটি কোনও সমস্যা নয়।


এই উত্তরে যুক্ত করতে, আপনি যদি স্ট্রিংভ্যালুয়াসকে ডাকেন o টুস্ট্রিং () আপনার যদি প্রয়োজন হয় তবে আপনি সরাসরি স্ট্রিংয়ে কাস্ট করতে পারেন।
eltiare

ভবিষ্যতের পাঠক: সম্পূর্ণরূপে যোগ্য নাম "মাইক্রোসফ্ট.এএসপনেটকোর.এইচটিপি.আইকিউয়েরোলকেশন ক্যোয়ারী স্ট্রিং = এই.রেকুয়েস্ট.কুয়েরি;" খনিটি "এসেম্বল মাইক্রোসফ্ট.এএসপনেটকোর.হট্ট্প.ফাইচার্স, সংস্করণ = ৩.১.০.০", এবং "মাইক্রোসফ্ট.এক্সটেনশনস.প্রিমিটিভস স্ট্রিংভ্যালিউস" (খনি ছিল "অ্যাসেম্বলি মাইক্রোসফট. এক্সটেনশনস.প্রিমিটিভস, সংস্করণ = ৩.১.২.০,")
গ্রানাডা কোডার

3

নেট কোর ইন যদি আপনি আমাদের দর্শনটিতে ক্যোরিস্ট্রিং অ্যাক্সেস করতে চান তবে এটি পছন্দ করুন

@Context.Request.Query["yourKey"]

যদি আমরা এমন স্থানে থাকি যেখানে @ কনটেক্সটটি উপলভ্য নয় তবে আমরা এটি পছন্দ করতে পারি ject

@inject Microsoft.AspNetCore.Http.IHttpContextAccessor HttpContextAccessor
@if (HttpContextAccessor.HttpContext.Request.Query.Keys.Contains("yourKey"))
{
      <text>do something </text>
}

কুকিজ জন্য

HttpContextAccessor.HttpContext.Request.Cookies["DeniedActions"]

2
সমস্ত কোডের প্রয়োজন নেই। কেবলমাত্র @ Context.Request.Query ["yourKey"] ব্যবহার করুন
শাদি নম্রুতি

হ্যাঁ @ শাদিমনরোটি আপনি ঠিক সেখানে আছেন যেখানে \ @ কনটেক্সটটি উপলভ্য হয় আমরা এটি \ @ কনটেক্সট.রেকুয়েস্ট.কুয়েরি ["আপনারকি"] এর মতো ব্যবহার করতে পারি তবে আমরা যদি নিয়ামক হয়ে থাকি তবে আমাদের এইচটিটিপি কনটেক্সটএকসেসর ইনজেক্ট করতে হবে। HTTPContext।
এম.আলি এল-সায়েদ

2

আমার এই সমস্যার আরও ভাল সমাধান আছে,

  • অনুরোধটি বিমূর্ত শ্রেণীর কন্ট্রোলারবেসের সদস্য a
  • গেটসর্পপ্যারাম () হ'ল বেলো সহায়ক শ্রেণিতে তৈরি একটি এক্সটেনশন পদ্ধতি।

var searchparams = await Request.GetSearchParams();

আমি কয়েকটি এক্সটেনশন পদ্ধতি সহ একটি স্ট্যাটিক ক্লাস তৈরি করেছি

public static class HttpRequestExtension
{
  public static async Task<SearchParams> GetSearchParams(this HttpRequest request)
        {
            var parameters = await request.TupledParameters();

            try
            {
                for (var i = 0; i < parameters.Count; i++)
                {
                    if (parameters[i].Item1 == "_count" && parameters[i].Item2 == "0")
                    {
                        parameters[i] = new Tuple<string, string>("_summary", "count");
                    }
                }
                var searchCommand = SearchParams.FromUriParamList(parameters);
                return searchCommand;
            }
            catch (FormatException formatException)
            {
                throw new FhirException(formatException.Message, OperationOutcome.IssueType.Invalid, OperationOutcome.IssueSeverity.Fatal, HttpStatusCode.BadRequest);
            }
        }



public static async Task<List<Tuple<string, string>>> TupledParameters(this HttpRequest request)
{
        var list = new List<Tuple<string, string>>();


        var query = request.Query;
        foreach (var pair in query)
        {
            list.Add(new Tuple<string, string>(pair.Key, pair.Value));
        }

        if (!request.HasFormContentType)
        {
            return list;
        }
        var getContent = await request.ReadFormAsync();

        if (getContent == null)
        {
            return list;
        }
        foreach (var key in getContent.Keys)
        {
            if (!getContent.TryGetValue(key, out StringValues values))
            {
                continue;
            }
            foreach (var value in values)
            {
                list.Add(new Tuple<string, string>(key, value));
            }
        }
        return list;
    }
}

এইভাবে আপনি সহজেই আপনার সমস্ত অনুসন্ধানের প্যারামিটারগুলি অ্যাক্সেস করতে পারবেন। আমি আশা করি এটি অনেক বিকাশকারীকে সহায়তা করবে :)


আমি কি কিছু মিস করছি - কোথায় ফিরএক্সেপশন সংজ্ঞায়িত হয়েছে, টাস্ক <সন্ধানপ্যারামস> কোন নামের জায়গাতে পাওয়া গেছে?
ডগ থম্পসন - ডগিফ্রেশ

1

কিছু মন্তব্য এর পাশাপাশি এটি উল্লেখ করেছে তবে এসপি নেট কোরটি আপনার জন্য এই সমস্ত কাজ করে।

নামের সাথে মেলে এমন কোনও কোয়েরি স্ট্রিং থাকলে এটি নিয়ামকটিতে উপলব্ধ।

HTTPS: // myapi / কিছু-শেষবিন্দু / 123 someQueryString = YayThisWorks

[HttpPost]
[Route("some-endpoint/{someValue}")]
public IActionResult SomeEndpointMethod(int someValue, string someQueryString)
    {
        Debug.WriteLine(someValue);
        Debug.WriteLine(someQueryString);
        return Ok();
    }

Ouputs:

123

YayThisWorks

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.