সি # তে ইউআরএল এর জন্য কীভাবে ক্যোয়ারী স্ট্রিং তৈরি করবেন?


473

একটি কোড থেকে ওয়েব সংস্থানগুলি কল করার সময় একটি সাধারণ কাজ সমস্ত প্রয়োজনীয় প্যারামিটারগুলি অন্তর্ভুক্ত করে কোয়েরি স্ট্রিং তৈরি করে। যদিও কোনও উপায়ে কোনও রকেট বিজ্ঞান নেই, এমন কিছু নিফটি বিশদ রয়েছে যা আপনার পছন্দ মতো করে দেখাতে হবে, &প্রথম প্যারামিটারটি না থাকলে একটি যুক্ত করা, প্যারামিটারগুলি এনকোডিং ইত্যাদি

এটি করার কোডটি খুব সহজ তবে কিছুটা ক্লান্তিকর:

StringBuilder SB = new StringBuilder();
if (NeedsToAddParameter A) 
{ 
  SB.Append("A="); SB.Append(HttpUtility.UrlEncode("TheValueOfA")); 
}

if (NeedsToAddParameter B) 
{
  if (SB.Length>0) SB.Append("&"); 
  SB.Append("B="); SB.Append(HttpUtility.UrlEncode("TheValueOfB")); }
}

এটি এমন একটি সাধারণ কাজ যেটি কোনও ইউটিলিটি শ্রেণীর উপস্থিতি আশা করবে যা এটি আরও মার্জিত এবং পাঠযোগ্য করে তোলে। এমএসডিএন স্ক্যান করে, আমি একটি খুঁজে পেতে ব্যর্থ হয়েছি - যা আমাকে নিম্নলিখিত প্রশ্নে নিয়ে আসে:

উপরেরটি করার বিষয়ে আপনি কী জানেন সবচেয়ে মার্জিত পরিষ্কার উপায়?


26
এটি কিছুটা দুঃখের বিষয় যে এমনকি সময়ে বর্তমান সময়েও, ক্যোরিস্ট্রিংগুলি মোকাবেলার জন্য কোনও সহজ সরল উপায় নেই বলে মনে হয় । এবং সোজাসাপ্টে, আমি একটি ওওবি, অভ্যন্তরীণ নয়, মানদণ্ড অনুসারে ফ্রেমওয়ার্ক বর্গ বোঝাতে চাইছি। অথবা হতে পারে আমি কিছু মিস করছি?
হতাশার গ্র্যামেস 21

5
আপনি কিছু মিস করছেন না। ভবন Querystring ফ্রেমওয়ার্ক যে আমি পূর্ণ করার চেষ্টা করেছি একটি প্রধান ফাঁক Flurl
টড মেনিয়ার


আপনি শুধু চিন্তা আমি এক .. নতুন UrlBuilder (বিদ্যমান) .AddQuery ( "মূল", "মান") গড়ে তুলতে চাই না পেয়েছিলাম ToString ()।
Demetris Leptos

উত্তর:


293

আপনি যদি হুডের নীচে সন্ধান করেন তবে ক্যোরিস্ট্রিং সম্পত্তি হ'ল নেমভ্যালু সংগ্রহ। আমি যখন অনুরূপ জিনিসগুলি করেছি তখন আমি সাধারণত সিরিয়ালিয়ালকরণ এবং ডিসেরায়ালাইজিংয়ের বিষয়ে আগ্রহী তাই আমার পরামর্শটি একটি নামভ্যালিউ কালেকশন তৈরি করা এবং তারপরে পাস করা উচিত:

using System.Linq;
using System.Web;
using System.Collections.Specialized;

private string ToQueryString(NameValueCollection nvc)
{
    var array = (
        from key in nvc.AllKeys
        from value in nvc.GetValues(key)
            select string.Format(
                "{0}={1}",
                HttpUtility.UrlEncode(key),
                HttpUtility.UrlEncode(value))
        ).ToArray();
    return "?" + string.Join("&", array);
}

আমি কল্পনা করতে পারি যে লিনকুতেও এটি করার একটি দুর্দান্ত মার্জিত উপায় আছে ...


22
এইচটিটিপি স্পেক (আরএফসি 2616) কোয়েরি স্ট্রিংগুলিতে কী থাকতে পারে সে সম্পর্কে কিছুই বলে না। আর আরএফসি 3986ও দেয় না, যা জেনেরিক ইউআরআই ফর্ম্যাটটি সংজ্ঞায়িত করে। অনুরোধের application/x-www-form-urlencodedঅংশ হিসাবে ফর্ম ডেটা জমা দেওয়ার উদ্দেশ্যে সাধারণত ব্যবহৃত হয় এমন কী / মান জুটির ফর্ম্যাটটি বলা হয় এবং এটি HTML দ্বারা সংজ্ঞায়িত হয় GET। এইচটিএমএল 5 এই বিন্যাসে প্রতি কী প্রতি একাধিক মান নিষেধ করে না এবং প্রকৃতপক্ষে এটির প্রয়োজন যে পৃষ্ঠাতে (ভুলভাবে) একই nameবৈশিষ্ট্য সহ একাধিক ক্ষেত্র রয়েছে সে ক্ষেত্রে ব্রাউজারটি প্রতি কী প্রতি একাধিক মান তৈরি করে । Goo.gl/uk1Ag
ড্যানিয়েল ক্যাসিডি

14
@ নানকাতা: আমি জানি আমার মন্তব্যটি এক বছরেরও বেশি পুরানো (এবং উত্তরটি দুই বছরেরও বেশি পুরানো!), তবে নেমভ্যালু কালেকশন খুব কী প্রতি একাধিক মানকে সমর্থন করে, গেটভ্যালু (কী) পদ্ধতিটি ব্যবহার করে।
মরিসিও শ্যাফার

4
@ মরিসিসিও শেফার: তবে নেমভ্যালিউ কালেকশন কোনও ক্যুরিস্ট্রিংকে "সঠিকভাবে" রূপান্তরিত করে না। উদাহরণস্বরূপ, আপনি যদি ওয়েবক্লিয়েন্টে কোয়েরিস্ট্রিং প্যারামিটার সেট করে থাকেন যেখানে একই কী একাধিকবার উপস্থিত থাকে তবে এটি "পথ? কী = মান 1 এবং কী = মান 2" এর পরিবর্তে "পথ? কী = মান 1, মান 2" তে রূপান্তরিত হয়, যা একটি সাধারণ (মানক) ?) প্যাটার্ন।
ডেভিড পোপ

8
প্রতি কী প্রতি একাধিক মান সম্পর্কিত, আমি বিশ্বাস করি যে এইচটিএমএল-তে আপনার যদি একাধিক আইটেম নির্বাচন করা এবং জমা দিয়ে একটি বহু-নির্বাচিত তালিকা-বাক্স থাকে তবে সেগুলি ডেভিডের দ্বারা উল্লিখিত একাধিক মান বিন্যাসে প্রেরণ করা হয়।
স্যাম

10
আপনি এইচটিটিপি ইউটিলিটির পরিবর্তে ইউরি.এজেক্টডেটা স্ট্রিং ব্যবহার করতে চাইতে পারেন rআরলএঙ্কোড যা আরও বহনযোগ্য। স্ট্যাকওভারফ্লো.com
জিজ্ঞাসা /

687

আপনি HttpValueCollectionকল করে একটি নতুন লিখনযোগ্য উদাহরণ তৈরি করতে পারেন System.Web.HttpUtility.ParseQueryString(string.Empty)এবং তারপরে যেকোন হিসাবে ব্যবহার করুন NameValueCollection। আপনি যে মানগুলি চান তা যুক্ত করার পরে, আপনি নীচের মত ToStringএকটি ক্যোয়ারী স্ট্রিং পেতে সংগ্রহটিতে কল করতে পারেন :

NameValueCollection queryString = System.Web.HttpUtility.ParseQueryString(string.Empty);

queryString.Add("key1", "value1");
queryString.Add("key2", "value2");

return queryString.ToString(); // Returns "key1=value1&key2=value2", all URL-encoded

HttpValueCollectionঅভ্যন্তরীণ ব্যবহারের জন্য এবং যাতে আপনি সরাসরি একটি দৃষ্টান্ত গঠন করা করতে পারবে না। যাইহোক, একবার আপনি উদাহরণ পেয়ে গেলে আপনি এটি অন্য যে কোনওর মতো ব্যবহার করতে পারেন NameValueCollection। যেহেতু আপনি প্রকৃত অবজেক্টের সাথে কাজ করছেন তা HttpValueCollectionহ'ল টোস্ট্রিং পদ্ধতিটি কল করা ওভাররাইড পদ্ধতিতে কল করবে HttpValueCollection, যা সংগ্রহটি ইউআরএল-এনকোডেড ক্যোয়ারী স্ট্রিং হিসাবে ফর্ম্যাট করে।

অনুরূপ ইস্যুটির উত্তরের জন্য এসও এবং ওয়েবে অনুসন্ধান করার পরে, এটি আমার সন্ধান করা সবচেয়ে সহজ সমাধান।

.NET কোর

আপনি যদি নেট কোরে কাজ করছেন তবে আপনি Microsoft.AspNetCore.WebUtilities.QueryHelpersক্লাসটি ব্যবহার করতে পারেন যা এটি ব্যাপকভাবে সরল করে।

https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.webutilities.queryhelpers

কোডের উদাহরণ:

const string url = "https://customer-information.azure-api.net/customers/search/taxnbr";
var param = new Dictionary<string, string>() { { "CIKey", "123456789" } };

var newUrl = new Uri(QueryHelpers.AddQueryString(url, param));

6
আপনি সম্ভবত আইডোরিয়াস ইন্টারফেসের জন্য ToURLQueryString নামে একটি এক্সটেনশন পদ্ধতি তৈরি করতে পারেন:public static string ToURLQueryString(this IDictionary dict) { ... }
রায় টিঙ্কার

65
এই পদ্ধতিটি মাল্টিবাইট অক্ষরগুলির জন্য মান- সম্মতিযুক্ত নয়। এটি তাদেরকে% XX% XX এর পরিবর্তে% uXXXX হিসাবে এনকোড করবে। ফলাফল অনুসন্ধানের স্ট্রিংগুলি ওয়েব সার্ভারগুলির দ্বারা ভুলভাবে ব্যাখ্যা করা যেতে পারে। এমনকি এটি অভ্যন্তরীণ কাঠামো ক্লাস এইচটিটিপিওয়ালিউ কালেকশনে নথিভুক্ত করা হয়েছে যা এইচটিটিপি ইউটিলিটি.পার্সেকুয়েরি স্ট্রিং () দ্বারা ফিরে আসে। মন্তব্য বলে যে তারা পশ্চাৎ-সামঞ্জস্যের কারণে এই আচরণটি রাখে।
অ্যালেক্স

25
দ্রষ্টব্য HTTPUटिलityPraseQueryString ("") এবং নতুন নেমভ্যালু সংগ্রহ () এর মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য আছে - কেবলমাত্র এইচটিপি ইউটিলিটি ফলাফল টোস্ট্রিংকে () সঠিক
ক্যোয়ারস্ট্রিং

7
আপনি ক্যোরি স্ট্রিংয়ে কোনও নামের একাধিক উদাহরণ চান সেই ক্ষেত্রে কী হবে? উদাহরণস্বরূপ, "টাইপ = 10 & টাইপ = 21"।
ফিনস্টার 21

7
@ ফিনস্টার আপনি Addপদ্ধতিটি ব্যবহার করে কোয়েরি স্ট্রিংয়ে একটি নামের একাধিক উদাহরণ যুক্ত করতে পারেন । উদাহরণস্বরূপ queryString.Add("type", "1"); queryString.Add("type", "2"); , Addপদ্ধতিটি ব্যবহার করা সম্ভবত বাস্তবে এই সমস্ত কিছু করার একটি ভাল উপায়।
জেরেমিসউইজ

94

রায় টিঙ্কারের মন্তব্য থেকে অনুপ্রেরণার সাথে আমি উরি ক্লাসে একটি সাধারণ এক্সটেনশন পদ্ধতি ব্যবহার করে শেষ করেছি যা আমার কোডকে সংক্ষিপ্ত এবং পরিষ্কার রাখে:

using System.Web;

public static class HttpExtensions
{
    public static Uri AddQuery(this Uri uri, string name, string value)
    {
        var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);

        httpValueCollection.Remove(name);
        httpValueCollection.Add(name, value);

        var ub = new UriBuilder(uri);
        ub.Query = httpValueCollection.ToString();

        return ub.Uri;
    }
}

ব্যবহার:

Uri url = new Uri("http://localhost/rest/something/browse").
          AddQuery("page", "0").
          AddQuery("pageSize", "200");

সম্পাদনা করুন - স্ট্যান্ডার্ডস অনুসারে বৈকল্পিক

বেশিরভাগ লোক যেমন উল্লেখ করেছেন, httpValueCollection.ToString()ইউনিকোড অক্ষরকে একটি মান-মান-সম্মতিজনক পদ্ধতিতে এনকোড করে । এটি একই এক্সটেনশন পদ্ধতির একটি বৈকল্পিক যা অবনতিহিত HttpUtility.UrlEncodeপদ্ধতির পরিবর্তে অনুরোধ পদ্ধতিতে এই জাতীয় অক্ষরগুলি পরিচালনা করে HttpUtility.UrlEncodeUnicode

using System.Web;

public static Uri AddQuery(this Uri uri, string name, string value)
{
    var httpValueCollection = HttpUtility.ParseQueryString(uri.Query);

    httpValueCollection.Remove(name);
    httpValueCollection.Add(name, value);

    var ub = new UriBuilder(uri);

    // this code block is taken from httpValueCollection.ToString() method
    // and modified so it encodes strings with HttpUtility.UrlEncode
    if (httpValueCollection.Count == 0)
        ub.Query = String.Empty;
    else
    {
        var sb = new StringBuilder();

        for (int i = 0; i < httpValueCollection.Count; i++)
        {
            string text = httpValueCollection.GetKey(i);
            {
                text = HttpUtility.UrlEncode(text);

                string val = (text != null) ? (text + "=") : string.Empty;
                string[] vals = httpValueCollection.GetValues(i);

                if (sb.Length > 0)
                    sb.Append('&');

                if (vals == null || vals.Length == 0)
                    sb.Append(val);
                else
                {
                    if (vals.Length == 1)
                    {
                        sb.Append(val);
                        sb.Append(HttpUtility.UrlEncode(vals[0]));
                    }
                    else
                    {
                        for (int j = 0; j < vals.Length; j++)
                        {
                            if (j > 0)
                                sb.Append('&');

                            sb.Append(val);
                            sb.Append(HttpUtility.UrlEncode(vals[j]));
                        }
                    }
                }
            }
        }

        ub.Query = sb.ToString();
    }

    return ub.Uri;
}

3
পারফেক্ট। আমার বাড়ির গ্রন্থাগারে যুক্ত হয়েছে। :)
অ্যান্ডি

1
আপনার মানটি ইউএনএল করা উচিত। ক্যোরিস্ট্রিং.এড (নাম, উরি.এস্কেপডাটাস্ট্রিং (মান));
উফুক হ্যাকোওলুলারı

2
এই উত্তরটির উন্নতি করার জন্য ধন্যবাদ। এটি মাল্টিবাইট অক্ষরগুলির সাথে সমস্যার সমাধান করেছে।
উফুক হ্যাকোওলুলার

9
সাইড নোট, এটি আপেক্ষিক ইউআরএলগুলির সাথে কাজ করে না কারণ আপনি আপেক্ষিক উরি থেকে উরিবিল্ডারকে ইনস্ট্যান্ট করতে পারবেন না।
ইউরি ফক্টোরিভিচ

1
আমি একটি সরানো কী যুক্ত করেছি যাতে একটি সদৃশ যোগ করা যায় না। dotnetfiddle.net/hTlyAd
পল

29

আমি কিছুক্ষণ আগে একই ধরণের প্রশ্নের উত্তর দিয়েছি । মূলত, ক্লাসটি ব্যবহার করার সর্বোত্তম উপায় হ'ল HttpValueCollectionএএসপি.এনইটি-র Request.QueryStringসম্পত্তি আসলে দুর্ভাগ্যক্রমে এটি .NET কাঠামোর অভ্যন্তরীণ। আপনি এটি ধরতে রিফ্লেক্টর ব্যবহার করতে পারেন (এবং এটি আপনার ইউটিলস শ্রেণিতে রাখুন)। এইভাবে আপনি কোয়ালিটি স্ট্রিংটিকে নেমভ্যালু কালেকশনের মতো করে পরিচালনা করতে পারে তবে সমস্ত ইউআরএল এনকোডিং / ডিকোডিং ইস্যু আপনার যত্ন নিয়েছে।

HttpValueCollectionপ্রসারিত হয় NameValueCollectionএবং এর সাথে একটি কনস্ট্রাক্টর থাকে যা এনকোডেড ক্যোয়ারী স্ট্রিং নেয় (অ্যাম্পারস্যান্ডগুলি এবং প্রশ্ন চিহ্নগুলি অন্তর্ভুক্ত করে) নেয় এবং এটি একটি ওভাররাইড করেToString() অন্তর্নিহিত সংগ্রহ থেকে ক্যোরি স্ট্রিংটি পুনরায় তৈরি করার জন্য পদ্ধতিকে ।

উদাহরণ:

  var coll = new HttpValueCollection();

  coll["userId"] = "50";
  coll["paramA"] = "A";
  coll["paramB"] = "B";      

  string query = coll.ToString(true); // true means use urlencode

  Console.WriteLine(query); // prints: userId=50&paramA=A&paramB=B

আপনাকে ধন্যবাদ ... আমি লক্ষ্য করেছি যে এটির সাথে নেমভ্যালু সংগ্রহের একটি টোস্ট্রিং রয়েছে () যা ভিন্নভাবে কাজ করে তবে কেন তা বুঝতে পারে না।
কালেবট

httpValueCollection.ToString()প্রকৃতপক্ষে httpValueCollection.ToString(true)যোগ করার জন্য প্রকৃতপক্ষে কলগুলি trueপ্রয়োজন হয় না।
dav_i

5
এইচটিটিপিভিউ কালেকশনটি একটি অভ্যন্তরীণ শ্রেণি তাই আপনি এটি ইনস্ট্যান্ট করতে পারেন না।
ওজবা

29

এখানে এক্সটেনশন পদ্ধতি হিসাবে পূর্ববর্তী / ল্যাম্বডা-ইশ উপায় রয়েছে (পূর্ববর্তী পোস্টগুলিতে ধারণাগুলির সংমিশ্রণ) যা একই কীটির জন্য একাধিক মানকে সমর্থন করে। আমার ব্যক্তিগত পছন্দটি হ'ল এই জাতীয় জিনিসগুলির জন্য অন্যান্য দলের সদস্যদের দ্বারা আবিষ্কার-সক্ষমতার জন্য মোড়কের উপরে এক্সটেনশন। নোট সেখানে এনকোডিং পদ্ধতি, স্ট্যাক ওভারফ্লো (এক ধরনের তে এটি সম্পর্কে পোস্টগুলি প্রচুর ঘিরে বিতর্ক যে পোস্টে ) এবং MSDN ব্লগার (মত এই এক )।

public static string ToQueryString(this NameValueCollection source)
{
    return String.Join("&", source.AllKeys
        .SelectMany(key => source.GetValues(key)
            .Select(value => String.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(value))))
        .ToArray());
}

সম্পাদনা: নাল সমর্থন সহ, যদিও আপনার সম্ভবত সম্ভবত এটি আপনার বিশেষ পরিস্থিতির জন্য খাপ খাইয়ে নিতে হবে

public static string ToQueryString(this NameValueCollection source, bool removeEmptyEntries)
{
    return source != null ? String.Join("&", source.AllKeys
        .Where(key => !removeEmptyEntries || source.GetValues(key)
            .Where(value => !String.IsNullOrEmpty(value))
            .Any())
        .SelectMany(key => source.GetValues(key)
            .Where(value => !removeEmptyEntries || !String.IsNullOrEmpty(value))
            .Select(value => String.Format("{0}={1}", HttpUtility.UrlEncode(key), value != null ? HttpUtility.UrlEncode(value) : string.Empty)))
        .ToArray())
        : string.Empty;
}

1
মানগুলির কোনও শূন্য হলে এটি ব্যর্থ হয়
জোশ নয়ে

এটি ভুল যে এটি প্রতিটি মূল মান জোড়ার জন্য অনেকগুলি ক্যোয়ারী স্ট্রিং উত্পন্ন করে
গায়ান

@ গেয়ানরানসিংহে: এর অর্থ কী?
ম্যাটি ভির্ককুনেন

22

উস্কানি [প্রকাশ: আমি লেখক] বেনামে অবজেক্টগুলির মাধ্যমে ক্যোয়ারী স্ট্রিংগুলি সমর্থন করে (অন্যান্য উপায়ে):

var url = "http://www.some-api.com".SetQueryParams(new
{
    api_key = ConfigurationManager.AppSettings["SomeApiKey"],
    max_results = 20,
    q = "Don't worry, I'll get encoded!"
});

Flচ্ছিক ফ্লুরল.এইচটিটিপি সহচর লিবিব আপনাকে সম্পূর্ণ প্রস্ফুটিত আরএসটি ক্লায়েন্টে প্রসারিত করে একই প্রবাহিত কল চেইন থেকে সরাসরি HTTP কল করতে দেয়:

T result = await "https://api.mysite.com"
    .AppendPathSegment("person")
    .SetQueryParams(new { ap_key = "my-key" })
    .WithOAuthBearerToken("MyToken")
    .PostJsonAsync(new { first_name = firstName, last_name = lastName })
    .ReceiveJson<T>();

সম্পূর্ণ প্যাকেজটি নুগেটে উপলভ্য:

PM> Install-Package Flurl.Http

অথবা কেবলমাত্র একা ইউআরএল বিল্ডার:

PM> Install-Package Flurl


20

এখানে আমার দেরী প্রবেশ। আমি অন্য কারওর পক্ষে বিভিন্ন কারণে পছন্দ করি না, তাই আমি আমার নিজের লেখা।

এই সংস্করণ বৈশিষ্ট্যগুলি:

  • কেবল স্ট্রিংবিল্ডারের ব্যবহার। কোনও ToArray () কল বা অন্যান্য এক্সটেনশন পদ্ধতি নেই। এটি অন্যান্য প্রতিক্রিয়াগুলির মতো দেখতে সুন্দর দেখাচ্ছে না, তবে আমি এটিকে একটি মূল ফাংশন হিসাবে বিবেচনা করি তাই দক্ষতা "সাবলীল", "ওয়ান-লাইনার" কোডের চেয়ে বেশি গুরুত্বপূর্ণ যা অদক্ষতাগুলি আড়াল করে।

  • প্রতি কি প্রতি একাধিক মান পরিচালনা করে। (এটি কেবল নিজের প্রয়োজন হয়নি তবে কেবল মরিসিয়োকে চুপ করে রাখতে;)

    public string ToQueryString(NameValueCollection nvc)
    {
        StringBuilder sb = new StringBuilder("?");
    
        bool first = true;
    
        foreach (string key in nvc.AllKeys)
        {
            foreach (string value in nvc.GetValues(key))
            {
                if (!first)
                {
                    sb.Append("&");
                }
    
                sb.AppendFormat("{0}={1}", Uri.EscapeDataString(key), Uri.EscapeDataString(value));
    
                first = false;
            }
        }
    
        return sb.ToString();
    }

ব্যবহারের উদাহরণ

        var queryParams = new NameValueCollection()
        {
            { "x", "1" },
            { "y", "2" },
            { "foo", "bar" },
            { "foo", "baz" },
            { "special chars", "? = &" },
        };

        string url = "http://example.com/stuff" + ToQueryString(queryParams);

        Console.WriteLine(url);

আউটপুট

http://example.com/stuff?x=1&y=2&foo=bar&foo=baz&special%20chars=%3F%20%3D%20%26

আমি পছন্দ করি যে এটি এইচটিপিটিউটিলিটি ব্যবহার করে না যা সিস্টেম.ওয়েব এর অধীন এবং সর্বত্র উপলব্ধ নয়।
কুগেল

লিনাক ব্যবহার না করার জন্য এবং এইচটিটিপি ইউটিলিটি ব্যবহার না করার জন্য +1। আমি একটি ফাঁকা এসবি তৈরি করে "বুল প্রথমে" ভেরিয়েবলটি খনন করব এবং তারপরে লুপে কেবল sb. Append (sb.Length == 0? "?": "&") Sb.Append Format () এর আগে তৈরি করব। এখন এনভিসি ফাঁকা থাকলে পদ্ধতিটি একাকী "?" এর পরিবর্তে খালি স্ট্রিংটি ফিরিয়ে দেবে।
ম্যাথিউ লেজার

এই উত্তরটি একাধিক মান সহ একক পরামিতি পরিচালনা করে। যেমন? id = 1 & id = 3 & id = 2 & id = 9
গণিত

12

কীভাবে এক্সটেনশন পদ্ধতি তৈরি করা যায় যা আপনাকে এইরকম সাবলীল স্টাইলে প্যারামিটার যুক্ত করতে দেয়?

string a = "http://www.somedomain.com/somepage.html"
    .AddQueryParam("A", "TheValueOfA")
    .AddQueryParam("B", "TheValueOfB")
    .AddQueryParam("Z", "TheValueOfZ");

string b = new StringBuilder("http://www.somedomain.com/anotherpage.html")
    .AddQueryParam("A", "TheValueOfA")
    .AddQueryParam("B", "TheValueOfB")
    .AddQueryParam("Z", "TheValueOfZ")
    .ToString(); 

এখানে এমন ওভারলোড যা ব্যবহার করে string:

public static string AddQueryParam(
    this string source, string key, string value)
{
    string delim;
    if ((source == null) || !source.Contains("?"))
    {
        delim = "?";
    }
    else if (source.EndsWith("?") || source.EndsWith("&"))
    {
        delim = string.Empty;
    }
    else
    {
        delim = "&";
    }

    return source + delim + HttpUtility.UrlEncode(key)
        + "=" + HttpUtility.UrlEncode(value);
}

এবং এখানে এমন ওভারলোড যা ব্যবহার করে StringBuilder:

public static StringBuilder AddQueryParam(
    this StringBuilder source, string key, string value)
{
    bool hasQuery = false;
    for (int i = 0; i < source.Length; i++)
    {
        if (source[i] == '?')
        {
            hasQuery = true;
            break;
        }
    }

    string delim;
    if (!hasQuery)
    {
        delim = "?";
    }
    else if ((source[source.Length - 1] == '?')
        || (source[source.Length - 1] == '&'))
    {
        delim = string.Empty;
    }
    else
    {
        delim = "&";
    }

    return source.Append(delim).Append(HttpUtility.UrlEncode(key))
        .Append("=").Append(HttpUtility.UrlEncode(value));
}

: +1: স্ট্রিং-ভিত্তিক সাধারণ এক্সটেনশন পদ্ধতির জন্য। অন্যান্য উত্তরের আরো কিছু প্রান্ত মামলা কভার করা হতে পারে, কিন্তু এই আমার অবস্থা জন্য যথেষ্ট, এবং এটা আমার একটি গঠন করা প্রয়োজন হয় না NameValueCollection, HttpValueCollectionঅথবা কোনো Uriপ্রথম। ধন্যবাদ!
স্ট্যানলে জি।

11

আমি যে পোর্টেবল ক্লাস লাইব্রেরি (পিসিএল) নিয়ে কাজ করছি তার জন্য একই সমস্যাটি সমাধান করার দরকার ছিল। এই ক্ষেত্রে আমার সিস্টেমে অ্যাক্সেস নেই e ওয়েব তাই আমি পার্সিকুয়ের স্ট্রিং ব্যবহার করতে পারি না।

পরিবর্তে আমি এর System.Net.Http.FormUrlEncodedContentমতো ব্যবহার করেছি:

var url = new UriBuilder("http://example.com");

url.Query = new FormUrlEncodedContent(new Dictionary<string,string>()
{
    {"param1", "val1"},
    {"param2", "val2"},
    {"param3", "val3"},
}).ReadAsStringAsync().Result;

এই কৌশলটি আমি ব্যবহার করি এবং এটি অন্য প্রশ্নে রেফারেন্স দিয়েছি http://stackoverflow.com/a/26744471/2108310 পার্থক্য কেবলমাত্র আমি সিস্টেমের রেফারেন্সের প্রয়োজন ব্যতীত কীভ্যালু জোড়গুলির একটি অ্যারে ব্যবহার করি। নেট (যা আপনি বলেছেন যেমন পিসিএল উপলভ্য) এটি তৃতীয় পক্ষের প্যাকেজটি অন্তর্ভুক্ত না করে বা কিছু হোমব্রিউ স্প্যাগেটি গণ্ডগোলের সাথে একত্রে চেষ্টা করার চেষ্টা না করে এটি করার সহজ উপায় H
রোস্তভ

9
    public static string ToQueryString(this Dictionary<string, string> source)
    {
        return String.Join("&", source.Select(kvp => String.Format("{0}={1}", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value))).ToArray());
    }

    public static string ToQueryString(this NameValueCollection source)
    {
        return String.Join("&", source.Cast<string>().Select(key => String.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(source[key]))).ToArray());
    }

1
নিস! তবে আপনার .ToArray()এস এর দরকার নেই ।
এমপেন

7

এই প্রকল্পটি আপনার প্রকল্পে যুক্ত করুন

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

public class QueryStringBuilder
{
    private readonly List<KeyValuePair<string, object>> _list;

    public QueryStringBuilder()
    {
        _list = new List<KeyValuePair<string, object>>();
    }

    public void Add(string name, object value)
    {
        _list.Add(new KeyValuePair<string, object>(name, value));
    }

    public override string ToString()
    {
        return String.Join("&", _list.Select(kvp => String.Concat(Uri.EscapeDataString(kvp.Key), "=", Uri.EscapeDataString(kvp.Value.ToString()))));
    }
}

এবং এটি এর মতো ব্যবহার করুন:

var actual = new QueryStringBuilder {
    {"foo", 123},
    {"bar", "val31"},
    {"bar", "val32"}
};

actual.Add("a+b", "c+d");

actual.ToString(); // "foo=123&bar=val31&bar=val32&a%2bb=c%2bd"

এখন, এটি গ্রহণযোগ্য উত্তর হওয়া উচিত; "foo [] = 1, foo [] = 2" এর মতো অ্যারেগুলির জন্য নিখুঁতভাবে কাজ করে পাশাপাশি প্যারামিটারের ক্রমটি রাখে যা উপায় দ্বারা খুব গুরুত্বপূর্ণ।
সুরেশ ফালাহাটি

6

আমার প্রস্তাব:

public static Uri AddQuery(this Uri uri, string name, string value)
{
    // this actually returns HttpValueCollection : NameValueCollection
    // which uses unicode compliant encoding on ToString()
    var query = HttpUtility.ParseQueryString(uri.Query);

    query.Add(name, value);

    var uriBuilder = new UriBuilder(uri)
    {
        Query = query.ToString()
    };

    return uriBuilder.Uri;
}

ব্যবহার:

var uri = new Uri("http://stackoverflow.com").AddQuery("such", "method")
                                             .AddQuery("wow", "soFluent");

// http://stackoverflow.com?such=method&wow=soFluent

আমি তোমার পদ্ধতির সহজ এবং মার্জিত পছন্দ করেন, তবে HttpUtility System.Web প্রয়োজন
Ody

5

স্বাক্ষরিত, তবে আমি মনে করি এই লাইনগুলি বরাবর কিছু খুব সুন্দরভাবে কাজ করবে

public class QueryString
{
    private Dictionary<string,string> _Params = new Dictionary<string,string>();

    public overide ToString()
    {
        List<string> returnParams = new List<string>();

        foreach (KeyValuePair param in _Params)
        {
            returnParams.Add(String.Format("{0}={1}", param.Key, param.Value));
        }

        // return String.Format("?{0}", String.Join("&", returnParams.ToArray())); 

        // credit annakata
        return "?" + String.Join("&", returnParams.ToArray());
    }

    public void Add(string key, string value)
    {
        _Params.Add(key, HttpUtility.UrlEncode(value));
    }
}

QueryString query = new QueryString();

query.Add("param1", "value1");
query.Add("param2", "value2");

return query.ToString();

সুন্দরভাবে এনক্যাপসুলেটেড তবে "? {0}" এ ফর্ম্যাটটি এক ধরণের অহেতুক ব্যয়বহুল :)
অন্নাকাটা

শ্রেণীর নাম পরিবর্তন করে কোয়েরিস্ট্রিং করা হয়েছে .. ক্যোয়ারি একটু অস্পষ্ট
নিক অ্যালেন

4

একটি দ্রুত সম্প্রসারণ পদ্ধতি ভিত্তিক সংস্করণ:

class Program
{
    static void Main(string[] args)
    {
        var parameters = new List<KeyValuePair<string, string>>
                             {
                                 new KeyValuePair<string, string>("A", "AValue"),
                                 new KeyValuePair<string, string>("B", "BValue")
                             };

        string output = "?" + string.Join("&", parameters.ConvertAll(param => param.ToQueryString()).ToArray());
    }
}

public static class KeyValueExtensions
{
    public static string ToQueryString(this KeyValuePair<string, string> obj)
    {
        return obj.Key + "=" + HttpUtility.UrlEncode(obj.Value);
    }
}

স্ট্রিংয়ে কোন পরামিতি যুক্ত হবে তা নির্বাচন করতে আপনি একটি ক্লজ ব্যবহার করতে পারেন।


3

ধরে নিই যে আপনি অন্যান্য সম্মেলনে নির্ভরতা হ্রাস করতে এবং জিনিসগুলি সহজ রাখতে চান, আপনি এটি করতে পারেন:

var sb = new System.Text.StringBuilder();

sb.Append("a=" + HttpUtility.UrlEncode("TheValueOfA") + "&");
sb.Append("b=" + HttpUtility.UrlEncode("TheValueOfB") + "&");
sb.Append("c=" + HttpUtility.UrlEncode("TheValueOfC") + "&");
sb.Append("d=" + HttpUtility.UrlEncode("TheValueOfD") + "&");

sb.Remove(sb.Length-1, 1); // Remove the final '&'

string result = sb.ToString();

এটি লুপগুলির সাথেও ভাল কাজ করে। চূড়ান্ত অ্যাম্পারস্যান্ড অপসারণটি লুপের বাইরে যেতে হবে।

মনে রাখবেন কনডাক্টেশন অপারেটরটি পঠনযোগ্যতা উন্নত করতে ব্যবহৃত হয়। স্ট্রিংবিল্ডার ব্যবহারের ব্যয়ের তুলনায় এটি ব্যবহারের ব্যয়টি ন্যূনতম (আমার মনে হয় জেফ আতউড এই বিষয়টিতে কিছু পোস্ট করেছেন)।


3

একটি অনামী অবজেক্ট সংস্করণ তৈরি করতে শীর্ষের উত্তরগুলি একত্রিত :

var queryString = HttpUtility2.BuildQueryString(new
{
    key2 = "value2",
    key1 = "value1",
});

এটি এটিকে উত্পন্ন করে:

key2 = VALUE2 & key1 = মান 1

কোডটি এখানে:

public static class HttpUtility2
{
    public static string BuildQueryString<T>(T obj)
    {
        var queryString = HttpUtility.ParseQueryString(string.Empty);

        foreach (var property in TypeDescriptor.GetProperties(typeof(T)).Cast<PropertyDescriptor>())
        {
            var value = (property.GetValue(obj) ?? "").ToString();
            queryString.Add(property.Name, value);
        }

        return queryString.ToString();
    }
}

2

গৃহীত সমাধান হিসাবে একই, তবে "ডট" লিনকিউ সিনট্যাক্সে স্থানান্তরিত হয়েছে ...

private string ToQueryString(NameValueCollection nvc)
{
    if (nvc == null) return String.Empty;
    var queryParams = 
          string.Join("&", nvc.AllKeys.Select(key => 
              string.Join("&", nvc.GetValues(key).Select(v => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(v))))));
    return "?" + queryParams;
}

2

উরির জন্য আমার কাছে একটি এক্সটেনশন পদ্ধতি রয়েছে যা:

  • নামবিহীন বস্তু গ্রহণ করে: uri.WithQuery(new { name = "value" })
  • string/stringজোড়া সংগ্রহ গ্রহণ করে (যেমন অভিধান eg২) ` )।
  • জোড়গুলির সংগ্রহ গ্রহণ করে string/object(যেমন রুটভ্যালু অভিধান ue )।
  • নেমভ্যালু সংগ্রহটি গ্রহণ করে
  • কী অনুসারে ক্যোয়ারী মানগুলি বাছাই করে তাই একই মানগুলি সমান ইউআরআই উত্পাদন করে।
  • তাদের মূল ক্রম সংরক্ষণ করে প্রতি কী প্রতি একাধিক মান সমর্থন করে।

নথিভুক্ত সংস্করণটি এখানে পাওয়া যাবে

প্রসার:

public static Uri WithQuery(this Uri uri, object values)
{
    if (uri == null)
        throw new ArgumentNullException(nameof(uri));

    if (values != null)
    {
        var query = string.Join(
            "&", from p in ParseQueryValues(values)
                 where !string.IsNullOrWhiteSpace(p.Key)
                 let k = HttpUtility.UrlEncode(p.Key.Trim())
                 let v = HttpUtility.UrlEncode(p.Value)
                 orderby k
                 select string.IsNullOrEmpty(v) ? k : $"{k}={v}");

        if (query.Length != 0 || uri.Query.Length != 0)
            uri = new UriBuilder(uri) { Query = query }.Uri;
    }

    return uri;
}

ক্যোয়ার পার্সার:

private static IEnumerable<KeyValuePair<string, string>> ParseQueryValues(object values)
{
    // Check if a name/value collection.
    var nvc = values as NameValueCollection;
    if (nvc != null)
        return from key in nvc.AllKeys
               from val in nvc.GetValues(key)
               select new KeyValuePair<string, string>(key, val);

    // Check if a string/string dictionary.
    var ssd = values as IEnumerable<KeyValuePair<string, string>>;
    if (ssd != null)
        return ssd;

    // Check if a string/object dictionary.
    var sod = values as IEnumerable<KeyValuePair<string, object>>;
    if (sod == null)
    {
        // Check if a non-generic dictionary.
        var ngd = values as IDictionary;
        if (ngd != null)
            sod = ngd.Cast<dynamic>().ToDictionary<dynamic, string, object>(
                p => p.Key.ToString(), p => p.Value as object);

        // Convert object properties to dictionary.
        if (sod == null)
            sod = new RouteValueDictionary(values);
    }

    // Normalize and return the values.
    return from pair in sod
           from val in pair.Value as IEnumerable<string>
            ?? new[] { pair.Value?.ToString() }
           select new KeyValuePair<string, string>(pair.Key, val);
}

টেস্টগুলি এখানে:

var uri = new Uri("https://stackoverflow.com/yo?oldKey=oldValue");

// Test with a string/string dictionary.
var q = uri.WithQuery(new Dictionary<string, string>
{
    ["k1"] = string.Empty,
    ["k2"] = null,
    ["k3"] = "v3"
});

Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?k1&k2&k3=v3"));

// Test with a string/object dictionary.
q = uri.WithQuery(new Dictionary<string, object>
{
    ["k1"] = "v1",
    ["k2"] = new[] { "v2a", "v2b" },
    ["k3"] = null
});

Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?k1=v1&k2=v2a&k2=v2b&k3"));

// Test with a name/value collection.
var nvc = new NameValueCollection()
{
    ["k1"] = string.Empty,
    ["k2"] = "v2a"
};

nvc.Add("k2", "v2b");

q = uri.WithQuery(nvc);
Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?k1&k2=v2a&k2=v2b"));

// Test with any dictionary.
q = uri.WithQuery(new Dictionary<int, HashSet<string>>
{
    [1] = new HashSet<string> { "v1" },
    [2] = new HashSet<string> { "v2a", "v2b" },
    [3] = null
});

Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?1=v1&2=v2a&2=v2b&3"));

// Test with an anonymous object.
q = uri.WithQuery(new
{
    k1 = "v1",
    k2 = new[] { "v2a", "v2b" },
    k3 = new List<string> { "v3" },
    k4 = true,
    k5 = null as Queue<string>
});

Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?k1=v1&k2=v2a&k2=v2b&k3=v3&k4=True&k5"));

// Keep existing query using a name/value collection.
nvc = HttpUtility.ParseQueryString(uri.Query);
nvc.Add("newKey", "newValue");

q = uri.WithQuery(nvc);
Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?newKey=newValue&oldKey=oldValue"));

// Merge two query objects using the RouteValueDictionary.
var an1 = new { k1 = "v1" };
var an2 = new { k2 = "v2" };

q = uri.WithQuery(
    new RouteValueDictionary(an1).Concat(
        new RouteValueDictionary(an2)));

Debug.Assert(q == new Uri(
    "https://stackoverflow.com/yo?k1=v1&k2=v2"));

2

এইচটিটিপিভ্যালু সংগ্রহের জন্য চেইন-সক্ষম র‍্যাপার ক্লাস:

namespace System.Web.Mvc {
    public class QueryStringBuilder {
        private NameValueCollection collection;
        public QueryStringBuilder() {
            collection = System.Web.HttpUtility.ParseQueryString(string.Empty);
        }
        public QueryStringBuilder Add(string key, string value) {
            collection.Add(key, value);
            return this;
        }
        public QueryStringBuilder Remove(string key) {
            collection.Remove(key);
            return this;
        }
        public string this[string key] {
            get { return collection[key]; }
            set { collection[key] = value; }
        }
        public string ToString() {
            return collection.ToString();
        }
    }
}

ব্যবহারের উদাহরণ:

QueryStringBuilder parameters = new QueryStringBuilder()
    .Add("view", ViewBag.PageView)
    .Add("page", ViewBag.PageNumber)
    .Add("size", ViewBag.PageSize);
string queryString = parameters.ToString();

1

আমি আমার পেজবেস ক্লাসে নিম্নলিখিত পদ্ধতিটি যুক্ত করেছি।

protected void Redirect(string url)
    {
        Response.Redirect(url);
    }
protected void Redirect(string url, NameValueCollection querystrings)
    {
        StringBuilder redirectUrl = new StringBuilder(url);

        if (querystrings != null)
        {
            for (int index = 0; index < querystrings.Count; index++)
            {
                if (index == 0)
                {
                    redirectUrl.Append("?");
                }

                redirectUrl.Append(querystrings.Keys[index]);
                redirectUrl.Append("=");
                redirectUrl.Append(HttpUtility.UrlEncode(querystrings[index]));

                if (index < querystrings.Count - 1)
                {
                    redirectUrl.Append("&");
                }
            }
        }

        this.Redirect(redirectUrl.ToString());
    }

কল করতে:

NameValueCollection querystrings = new NameValueCollection();    
querystrings.Add("language", "en");
querystrings.Add("id", "134");
this.Redirect("http://www.mypage.com", querystrings);

1

আমি কিছু এক্সটেনশন পদ্ধতি লিখেছি যা কোয়েরিস্ট্রিংসের সাথে কাজ করার সময় আমি খুব দরকারী। প্রায়শই আমি বর্তমান কোয়েরিস্ট্রিং দিয়ে শুরু করতে এবং এটি ব্যবহার করার আগে সংশোধন করতে চাই। কিছুটা এইরকম,

var res = Request.QueryString.Duplicate()
  .ChangeField("field1", "somevalue")
  .ChangeField("field2", "only if following is true", true)
  .ChangeField("id", id, id>0)
  .WriteLocalPathWithQuery(Request.Url)); //Uses context to write the path

আরও এবং উত্স জন্য: http://www.charlesrcook.com/archive/2008/07/23/c-extension-methods-for-asp.net-query-string-operation.aspx

এটি বেসিক, তবে আমি স্টাইলটি পছন্দ করি।


1

আমার 2 সেন্টে ফেলতে চেয়েছিল:

public static class HttpClientExt
{
    public static Uri AddQueryParams(this Uri uri, string query)
    {
        var ub = new UriBuilder(uri);
        ub.Query = string.IsNullOrEmpty(uri.Query) ? query : string.Join("&", uri.Query.Substring(1), query);
        return ub.Uri;
    }

    public static Uri AddQueryParams(this Uri uri, IEnumerable<string> query)
    {
        return uri.AddQueryParams(string.Join("&", query));
    } 

    public static Uri AddQueryParams(this Uri uri, string key, string value)
    {
        return uri.AddQueryParams(string.Join("=", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(value)));
    }

    public static Uri AddQueryParams(this Uri uri, params KeyValuePair<string,string>[] kvps)
    {
        return uri.AddQueryParams(kvps.Select(kvp => string.Join("=", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value))));
    }

    public static Uri AddQueryParams(this Uri uri, IDictionary<string, string> kvps)
    {
        return uri.AddQueryParams(kvps.Select(kvp => string.Join("=", HttpUtility.UrlEncode(kvp.Key), HttpUtility.UrlEncode(kvp.Value))));
    }

    public static Uri AddQueryParams(this Uri uri, NameValueCollection nvc)
    {
        return uri.AddQueryParams(nvc.AllKeys.SelectMany(nvc.GetValues, (key, value) => string.Join("=", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(value))));
    }
}

ডক্স বলে যে uri.Queryএটি দিয়ে শুরু হবে? এটি খালি না থাকলে এবং আপনি যদি এটি পরিবর্তন করতে চলেছেন তবে আপনার এটি ছাঁটাই করা উচিত।

নোট যে HttpUtility.UrlEncodeপাওয়া যায় System.Web

ব্যবহার:

var uri = new Uri("https://api.del.icio.us/v1/posts/suggest").AddQueryParam("url","http://stackoverflow.com")

1

মার্জিত না হলেও, আমি একটি সহজ সংস্করণ বেছে নিয়েছি যা ব্যবহার না করে NameValueCollecitons- কেবল একটি বিল্ডার প্যাটার্ন চারপাশে মোড়ানো StringBuilder

public class UrlBuilder
{
    #region Variables / Properties

    private readonly StringBuilder _builder;

    #endregion Variables / Properties

    #region Constructor

    public UrlBuilder(string urlBase)
    {
        _builder = new StringBuilder(urlBase);
    }

    #endregion Constructor

    #region Methods

    public UrlBuilder AppendParameter(string paramName, string value)
    {
        if (_builder.ToString().Contains("?"))
            _builder.Append("&");
        else
            _builder.Append("?");

        _builder.Append(HttpUtility.UrlEncode(paramName));
        _builder.Append("=");
        _builder.Append(HttpUtility.UrlEncode(value));

        return this;
    }

    public override string ToString()
    {
        return _builder.ToString();
    }

    #endregion Methods
}

বিদ্যমান উত্তরগুলি অনুসারে, আমি HttpUtility.UrlEncodeকলগুলি নিশ্চিত করেছিলাম । এটি এর মতো ব্যবহৃত হয়:

string url = new UrlBuilder("http://www.somedomain.com/")
             .AppendParameter("a", "true")
             .AppendParameter("b", "muffin")
             .AppendParameter("c", "muffin button")
             .ToString();
// Result: http://www.somedomain.com?a=true&b=muffin&c=muffin%20button

1
// USAGE
[TestMethod]
public void TestUrlBuilder()
{
    Console.WriteLine(
        new UrlBuilder("http://www.google.com?A=B")
            .AddPath("SomePathName")
            .AddPath("AnotherPathName")
            .SetQuery("SomeQueryKey", "SomeQueryValue")
            .AlterQuery("A", x => x + "C"));
}

আউটপুট:

http://www.google.com/SomePathName/AnotherPathName?A=BC&SomeQueryKey=SomeQueryValue

কোড; আপনি সকলেই যে কোনও জায়গায় আমাকে ধন্যবাদ দিতে পারেন: ডি

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

// By Demetris Leptos
namespace TheOperator.Foundation.Web
{
    public class UrlBuilder
    {
        public string Scheme { get; set; }

        public string Host { get; set; }

        public int? Port { get; set; }

        public List<string> Paths { get; set; }

        public SortedDictionary<string, string> QueryPairs { get; set; }

        public UrlBuilder(string url)
        {
            this.Paths = new List<string>();
            this.QueryPairs = new SortedDictionary<string, string>();

            string path = null;
            string query = null;
            Uri relativeUri = null;
            if (!Uri.TryCreate(url, UriKind.Relative, out relativeUri))
            {
                var uriBuilder = new UriBuilder(url);
                this.Scheme = uriBuilder.Scheme;
                this.Host = uriBuilder.Host;
                this.Port = uriBuilder.Port;
                path = uriBuilder.Path;
                query = uriBuilder.Query;
            }
            else
            {
                var queryIndex = url.IndexOf('?');
                if (queryIndex >= 0)
                {
                    path = url.Substring(0, queryIndex);
                    query = url.Substring(queryIndex + 1);
                }
                else
                {
                    path = url;
                }
            }
            this.Paths.AddRange(path.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries));
            if (query != null)
            {
                var queryKeyValuePairs = HttpUtility.ParseQueryString(query);
                foreach (var queryKey in queryKeyValuePairs.AllKeys)
                {
                    this.QueryPairs[queryKey] = queryKeyValuePairs[queryKey];
                }
            }
        }

        public UrlBuilder AddPath(string value)
        {
            this.Paths.Add(value);
            return this;
        }

        public UrlBuilder SetQuery(string key, string value)
        {
            this.QueryPairs[key] = value;
            return this;
        }

        public UrlBuilder RemoveQuery(string key)
        {
            this.QueryPairs.Remove(key);
            return this;
        }

        public UrlBuilder AlterQuery(string key, Func<string, string> alterMethod, bool removeOnNull = false)
        {
            string value;
            this.QueryPairs.TryGetValue(key, out value);
            value = alterMethod(value);
            if (removeOnNull && value == null)
            {
                return this.RemoveQuery(key);
            }
            else
            {
                return this.SetQuery(key, value);
            }
        }

        public override string ToString()
        {
            var path = !string.IsNullOrWhiteSpace(this.Host)
                ? string.Join("/", this.Host, string.Join("/", this.Paths))
                : string.Join("/", this.Paths);
            var query = string.Join("&", this.QueryPairs.Select(x => string.Concat(x.Key, "=", HttpUtility.UrlEncode(x.Value))));
            return string.Concat(
                !string.IsNullOrWhiteSpace(this.Scheme) ? string.Concat(this.Scheme, "://") : null,
                path,
                !string.IsNullOrWhiteSpace(query) ? string.Concat("?", query) : null);
        }
    }
}

1

আমি ডিএসওর প্রস্তাবিত সমাধানটি দিয়ে গেলাম (২১ শে আগস্ট '11 এ 7:25 এ উত্তর দিয়েছি), তার সমাধানটির জন্য এইচটিপি ইউটিলিটি ব্যবহার করার প্রয়োজন নেই require তবে ডটনেটপার্লসে পোস্ট করা নিবন্ধ অনুসারে , ডেমোশনারি ব্যবহার করা নামভ্যালিউ কালেকশন ব্যবহারের চেয়ে দ্রুত (পারফরম্যান্সে) is নেমভ্যালু কালেকশনের জায়গায় অভিধান ব্যবহার করতে ডিএসওর সমাধানটি এখানে পরিবর্তন করা হয়েছে।

    public static Dictionary<string, string> QueryParametersDictionary()
    {
        var dictionary = new Dictionary<string, string>();
        dictionary.Add("name", "John Doe");
        dictionary.Add("address.city", "Seattle");
        dictionary.Add("address.state_code", "WA");
        dictionary.Add("api_key", "5352345263456345635");

        return dictionary;
    }

    public static string ToQueryString(Dictionary<string, string> nvc)
    {
        StringBuilder sb = new StringBuilder();

        bool first = true;

        foreach (KeyValuePair<string, string> pair in nvc)
        {
                if (!first)
                {
                    sb.Append("&");
                }

                sb.AppendFormat("{0}={1}", Uri.EscapeDataString(pair.Key), Uri.EscapeDataString(pair.Value));

                first = false;
        }

        return sb.ToString();
    }

1

ক্যোয়ারী স্ট্রিংটি একটি ইউআরএল দ্বারা যুক্ত করা যেতে পারে:

  1. একটি নাম মান সংগ্রহ অবজেক্ট তৈরি করুন
  2. এই অবজেক্টটিতে ক্যোয়ারী স্ট্রিং আইটেম এবং তাদের মান যুক্ত করুন
  3. এই নামটির মান সংগ্রহের অবজেক্টটি ইউআরএল-তে কোডটি নীচের লিঙ্কে সরবরাহ করা হয়েছে enc

https://blog.codingnovice.com/blog

public ActionResult Create()
{
    //declaring name value collection object
    NameValueCollection collection = new NameValueCollection();

    //adding new value to the name value collection object
    collection.Add("Id1", "wwe323");
    collection.Add("Id2", "454w");
    collection.Add("Id3", "tyt5656");
    collection.Add("Id4", "343wdsd");

    //generating query string
    string url = GenerateQueryString(collection);

    return View();
}

private string GenerateQueryString(NameValueCollection collection)
{
    var querystring = (
        from key in collection.AllKeys
        from value in collection.GetValues(key)
        select string.Format("{0}={1}",
            HttpUtility.UrlEncode(key),
            HttpUtility.UrlEncode(value))
    ).ToArray();
    return "?" + string.Join("&", querystring);
}

0

অন্যান্য উত্তর থেকে কিছু ইঙ্গিত ব্যবহার করে আমি আমার রেজার প্রকল্পের জন্য একটি সহায়ক লিখেছি।

পার্সেকুয়েরিস্ট্রিং ব্যবসায়টি প্রয়োজনীয় কারণ আমাদের বর্তমান অনুরোধের ক্যোরিস্ট্রিং অবজেক্টের সাথে छेলা করার অনুমতি নেই।

@helper GetQueryStringWithValue(string key, string value) {
    var queryString = System.Web.HttpUtility.ParseQueryString(HttpContext.Current.Request.QueryString.ToString());
    queryString[key] = value;
    @Html.Raw(queryString.ToString())
}

আমি এটি এর মতো ব্যবহার করি:

location.search = '?@Helpers.GetQueryStringWithValue("var-name", "var-value")';

আপনি যদি এটির চেয়ে বেশি মান গ্রহণ করতে চান তবে কেবল একটি অভিধানে প্যারামিটারগুলি পরিবর্তন করুন এবং ক্যোয়ারী স্ট্রিংয়ে জোড়া যুক্ত করুন।


0

নীচের কোডটি HttpValueCollectionবাস্তবায়ন বন্ধ করে দেওয়া হয়েছেToString আইএলএসপিএস এর মাধ্যমে যা আপনাকে একটি নাম দেয় = মান কোয়েরিস্ট্রিং।

দুর্ভাগ্যক্রমে এইচটিটিপিভ্যালু কালেকশন হল একটি অভ্যন্তরীণ শ্রেণী যা আপনি যদি ব্যবহার করেন তবে আপনি কেবল কখনও ফিরে পাবেন HttpUtility.ParseQueryString()। আমি এতে সমস্ত ভিউস্টেট অংশগুলি সরিয়েছি এবং এটি ডিফল্টরূপে এনকোড করে:

public static class HttpExtensions
{
    public static string ToQueryString(this NameValueCollection collection)
    {
        // This is based off the NameValueCollection.ToString() implementation
        int count = collection.Count;
        if (count == 0)
            return string.Empty;

        StringBuilder stringBuilder = new StringBuilder();

        for (int i = 0; i < count; i++)
        {
            string text = collection.GetKey(i);
            text = HttpUtility.UrlEncodeUnicode(text);
            string value = (text != null) ? (text + "=") : string.Empty;
            string[] values = collection.GetValues(i);
            if (stringBuilder.Length > 0)
            {
                stringBuilder.Append('&');
            }
            if (values == null || values.Length == 0)
            {
                stringBuilder.Append(value);
            }
            else
            {
                if (values.Length == 1)
                {
                    stringBuilder.Append(value);
                    string text2 = values[0];
                    text2 = HttpUtility.UrlEncodeUnicode(text2);
                    stringBuilder.Append(text2);
                }
                else
                {
                    for (int j = 0; j < values.Length; j++)
                    {
                        if (j > 0)
                        {
                            stringBuilder.Append('&');
                        }
                        stringBuilder.Append(value);
                        string text2 = values[j];
                        text2 = HttpUtility.UrlEncodeUnicode(text2);
                        stringBuilder.Append(text2);
                    }
                }
            }
        }

        return stringBuilder.ToString();
    }
}

0

এটি সামান্য আরও কমপ্যাক্ট বাদে গৃহীত উত্তরের অনুরূপ:

private string ToQueryString(NameValueCollection nvc)
{
    return "?" + string.Join("&", nvc.AllKeys.Select(k => string.Format("{0}={1}", 
        HttpUtility.UrlEncode(k), 
        HttpUtility.UrlEncode(nvc[k]))));
}

0

কেবলমাত্র তাদের জন্য শীর্ষ-উত্তরের VB.NET সংস্করণ প্রয়োজন:

Public Function ToQueryString(nvc As System.Collections.Specialized.NameValueCollection) As String
    Dim array As String() = nvc.AllKeys.SelectMany(Function(key As String) nvc.GetValues(key), Function(key As String, value As String) String.Format("{0}={1}", System.Web.HttpUtility.UrlEncode(key), System.Web.HttpUtility.UrlEncode(value))).ToArray()
    Return "?" + String.Join("&", array)
End Function

এবং লিনকিউ ছাড়াই সংস্করণ:

Public Function ToQueryString(nvc As System.Collections.Specialized.NameValueCollection) As String
    Dim lsParams As New List(Of String)()

    For Each strKey As String In nvc.AllKeys
        Dim astrValue As String() = nvc.GetValues(strKey)

        For Each strValue As String In astrValue
            lsParams.Add(String.Format("{0}={1}", System.Web.HttpUtility.UrlEncode(strKey), System.Web.HttpUtility.UrlEncode(strValue)))
        Next ' Next strValue
    Next ' strKey
    Dim astrParams As String() = lsParams.ToArray()
    lsParams.Clear()
    lsParams = Nothing

    Return "?" + String.Join("&", astrParams)
End Function ' ToQueryString

এবং লিনকিউ ছাড়াই সি # সংস্করণ:

    public static string ToQueryString(System.Collections.Specialized.NameValueCollection nvc)
    {
        List<string> lsParams = new List<string>();

        foreach (string strKey in nvc.AllKeys)
        {
            string[] astrValue = nvc.GetValues(strKey);

            foreach (string strValue in astrValue)
            {
                lsParams.Add(string.Format("{0}={1}", System.Web.HttpUtility.UrlEncode(strKey), System.Web.HttpUtility.UrlEncode(strValue)));
            } // Next strValue

        } // Next strKey

        string[] astrParams =lsParams.ToArray();
        lsParams.Clear();
        lsParams = null;

        return "?" + string.Join("&", astrParams);
    } // End Function ToQueryString
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.