স্ট্রিংয়ের মানগুলিতে যুক্ত করুন


162

আমি নীচের মত ইউআরএল এর অনুরূপ একটি তালিকা আছে

আমি নিম্নলিখিত কোডটি ব্যবহার করে ক্যোরি স্ট্রিংগুলি পরিচালনা করতে সক্ষম হয়েছি:

myurl = longurl.Split('?');
NameValueCollection qs = HttpUtility.ParseQueryString(myurl [1]);

foreach (string lol in qs)
{
    // results will return
}

তবে এটি প্রদত্ত ইউআরএলের উপর ভিত্তি করে কেবল আইডি , সার্ভার , অবস্থান এবং এর মতো প্যারামিটারগুলি প্রদান করে।

আমার যা প্রয়োজন তা হ'ল বিদ্যমান ক্যোয়ারী স্ট্রিংগুলিতে মান যুক্ত / সংযুক্ত করা।

ইউআরএল সহ উদাহরণস্বরূপ:

http://somesite.com/backup/index.php?action=login&attempts=1

আমার ক্যোয়ারী স্ট্রিং প্যারামিটারের মানগুলি পরিবর্তন করতে হবে:

কর্ম = login1

প্রচেষ্টা = 11

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

উত্তর:


328

পার্সিং, ইউআরএল এনকোডিং ইত্যাদি বিষয় নিয়ে চিন্তা না করে আপনি সেই HttpUtility.ParseQueryStringপদ্ধতিটি এবং UriBuilderক্যোয়ারিং স্ট্রিং প্যারামিটারগুলির সাথে কাজ করার একটি দুর্দান্ত উপায় সরবরাহ করতে পারেন ...:

string longurl = "http://somesite.com/news.php?article=1&lang=en";
var uriBuilder = new UriBuilder(longurl);
var query = HttpUtility.ParseQueryString(uriBuilder.Query);
query["action"] = "login1";
query["attempts"] = "11";
uriBuilder.Query = query.ToString();
longurl = uriBuilder.ToString();
// "http://somesite.com:80/news.php?article=1&lang=en&action=login1&attempts=11"

5
আপনি যেমন আমার উদাহরণ থেকে দেখতে পাচ্ছেন আপনি পরামিতিগুলির জন্য পরিবর্তনশীল নামগুলি ব্যবহার করতে পারেন। এবং এটি ঠিক এটিই করে: এটি বিদ্যমান ইউআরএলটিতে 2 পরামিতি যুক্ত করে যা আমি এখানে হার্ডকোড করেছি তবে তারা গতিশীল হতে পারে perfectly
দারিন দিমিত্রভ

1
HttpUtility.UrlEncode()প্যারামিটার মান নির্ধারণের সময় আমাদের ব্যবহার করা উচিত নয় ?
ইউজারকন্ট্রোল

1
@ ইউজারকন্ট্রোল, না, HttpUtility.ParseQueryStringপদ্ধতিটি একটি বিশেষ নেমভ্যালিউ কালেকশন বাস্তবায়ন প্রদান করে যা ইতিমধ্যে আপনি যখন কোনও মান সেট করেন তখন পর্দার আড়ালে এটি পরিচালনা করে।
দারিন দিমিত্রভ

5
বামার যে এটি সিস্টেমের উপর নির্ভরশীলতা রয়েছে W ওয়েব: /
খাঁটি K ক্রোম

4
এটি লক্ষণীয় যে এই পদ্ধতির ফলে আন্তর্জাতিকীকরণের সাথে সমস্যাগুলির কারণ হতে পারে কারণ বিশেষ অক্ষরগুলি ক্যোয়ারিতে তাদের ইউনিকোড সমতুল্যে রূপান্তরিত হবে oস্টস্ট্রিং () পদ্ধতিতে।
tezromania

104

আমি দারিনের উত্তরটি একটি সুন্দর পুনঃব্যবহারযোগ্য এক্সটেনশন পদ্ধতিতে আবৃত করেছি ।

public static class UriExtensions
{
    /// <summary>
    /// Adds the specified parameter to the Query String.
    /// </summary>
    /// <param name="url"></param>
    /// <param name="paramName">Name of the parameter to add.</param>
    /// <param name="paramValue">Value for the parameter to add.</param>
    /// <returns>Url with added parameter.</returns>
    public static Uri AddParameter(this Uri url, string paramName, string paramValue)
    {
        var uriBuilder = new UriBuilder(url);
        var query = HttpUtility.ParseQueryString(uriBuilder.Query);
        query[paramName] = paramValue;
        uriBuilder.Query = query.ToString();

        return uriBuilder.Uri;
    }
}

আশা করি এটা কাজে লাগবে!


55

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

এখানে নেট ওয়ার্কআউন্ড যা নিখরচায় এবং আপেক্ষিক উভয় পাথের জন্য কাজ করে, নেট 4 এ লিখিত এবং পরীক্ষিত:

(ছোট দ্রষ্টব্য: এটি। নেট 4.5 এও কাজ করা উচিত, আপনাকে কেবল এতে পরিবর্তন propInfo.GetValue(values, null)করতে হবে propInfo.GetValue(values))

  public static class UriExtensions{
    /// <summary>
    ///     Adds query string value to an existing url, both absolute and relative URI's are supported.
    /// </summary>
    /// <example>
    /// <code>
    ///     // returns "www.domain.com/test?param1=val1&amp;param2=val2&amp;param3=val3"
    ///     new Uri("www.domain.com/test?param1=val1").ExtendQuery(new Dictionary&lt;string, string&gt; { { "param2", "val2" }, { "param3", "val3" } }); 
    /// 
    ///     // returns "/test?param1=val1&amp;param2=val2&amp;param3=val3"
    ///     new Uri("/test?param1=val1").ExtendQuery(new Dictionary&lt;string, string&gt; { { "param2", "val2" }, { "param3", "val3" } }); 
    /// </code>
    /// </example>
    /// <param name="uri"></param>
    /// <param name="values"></param>
    /// <returns></returns>
    public static Uri ExtendQuery(this Uri uri, IDictionary<string, string> values) {
      var baseUrl = uri.ToString();
      var queryString = string.Empty;
      if (baseUrl.Contains("?")) {
        var urlSplit = baseUrl.Split('?');
        baseUrl = urlSplit[0];
        queryString = urlSplit.Length > 1 ? urlSplit[1] : string.Empty;
      }

      NameValueCollection queryCollection = HttpUtility.ParseQueryString(queryString);
      foreach (var kvp in values ?? new Dictionary<string, string>()) {
        queryCollection[kvp.Key] = kvp.Value;
      }
      var uriKind = uri.IsAbsoluteUri ? UriKind.Absolute : UriKind.Relative;
      return queryCollection.Count == 0 
        ? new Uri(baseUrl, uriKind) 
        : new Uri(string.Format("{0}?{1}", baseUrl, queryCollection), uriKind);
    }

    /// <summary>
    ///     Adds query string value to an existing url, both absolute and relative URI's are supported.
    /// </summary>
    /// <example>
    /// <code>
    ///     // returns "www.domain.com/test?param1=val1&amp;param2=val2&amp;param3=val3"
    ///     new Uri("www.domain.com/test?param1=val1").ExtendQuery(new { param2 = "val2", param3 = "val3" }); 
    /// 
    ///     // returns "/test?param1=val1&amp;param2=val2&amp;param3=val3"
    ///     new Uri("/test?param1=val1").ExtendQuery(new { param2 = "val2", param3 = "val3" }); 
    /// </code>
    /// </example>
    /// <param name="uri"></param>
    /// <param name="values"></param>
    /// <returns></returns>
    public static Uri ExtendQuery(this Uri uri, object values) {
      return ExtendQuery(uri, values.GetType().GetProperties().ToDictionary
      (
          propInfo => propInfo.Name,
          propInfo => { var value = propInfo.GetValue(values, null); return value != null ? value.ToString() : null; }
      ));
    }
  }

এবং আচরণটি পরীক্ষা করার জন্য এখানে ইউনিট পরীক্ষার একটি স্যুট রয়েছে:

  [TestFixture]
  public class UriExtensionsTests {
    [Test]
    public void Add_to_query_string_dictionary_when_url_contains_no_query_string_and_values_is_empty_should_return_url_without_changing_it() {
      Uri url = new Uri("http://www.domain.com/test");
      var values = new Dictionary<string, string>();
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test")));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_contains_hash_and_query_string_values_are_empty_should_return_url_without_changing_it() {
      Uri url = new Uri("http://www.domain.com/test#div");
      var values = new Dictionary<string, string>();
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test#div")));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_contains_no_query_string_should_add_values() {
      Uri url = new Uri("http://www.domain.com/test");
      var values = new Dictionary<string, string> { { "param1", "val1" }, { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test?param1=val1&param2=val2")));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_contains_hash_and_no_query_string_should_add_values() {
      Uri url = new Uri("http://www.domain.com/test#div");
      var values = new Dictionary<string, string> { { "param1", "val1" }, { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test#div?param1=val1&param2=val2")));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_contains_query_string_should_add_values_and_keep_original_query_string() {
      Uri url = new Uri("http://www.domain.com/test?param1=val1");
      var values = new Dictionary<string, string> { { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test?param1=val1&param2=val2")));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_is_relative_contains_no_query_string_should_add_values() {
      Uri url = new Uri("/test", UriKind.Relative);
      var values = new Dictionary<string, string> { { "param1", "val1" }, { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=val1&param2=val2", UriKind.Relative)));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_is_relative_and_contains_query_string_should_add_values_and_keep_original_query_string() {
      Uri url = new Uri("/test?param1=val1", UriKind.Relative);
      var values = new Dictionary<string, string> { { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=val1&param2=val2", UriKind.Relative)));
    }

    [Test]
    public void Add_to_query_string_dictionary_when_url_is_relative_and_contains_query_string_with_existing_value_should_add_new_values_and_update_existing_ones() {
      Uri url = new Uri("/test?param1=val1", UriKind.Relative);
      var values = new Dictionary<string, string> { { "param1", "new-value" }, { "param2", "val2" } };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=new-value&param2=val2", UriKind.Relative)));
    }

    [Test]
    public void Add_to_query_string_object_when_url_contains_no_query_string_should_add_values() {
      Uri url = new Uri("http://www.domain.com/test");
      var values = new { param1 = "val1", param2 = "val2" };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test?param1=val1&param2=val2")));
    }


    [Test]
    public void Add_to_query_string_object_when_url_contains_query_string_should_add_values_and_keep_original_query_string() {
      Uri url = new Uri("http://www.domain.com/test?param1=val1");
      var values = new { param2 = "val2" };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("http://www.domain.com/test?param1=val1&param2=val2")));
    }

    [Test]
    public void Add_to_query_string_object_when_url_is_relative_contains_no_query_string_should_add_values() {
      Uri url = new Uri("/test", UriKind.Relative);
      var values = new { param1 = "val1", param2 = "val2" };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=val1&param2=val2", UriKind.Relative)));
    }

    [Test]
    public void Add_to_query_string_object_when_url_is_relative_and_contains_query_string_should_add_values_and_keep_original_query_string() {
      Uri url = new Uri("/test?param1=val1", UriKind.Relative);
      var values = new { param2 = "val2" };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=val1&param2=val2", UriKind.Relative)));
    }

    [Test]
    public void Add_to_query_string_object_when_url_is_relative_and_contains_query_string_with_existing_value_should_add_new_values_and_update_existing_ones() {
      Uri url = new Uri("/test?param1=val1", UriKind.Relative);
      var values = new { param1 = "new-value", param2 = "val2" };
      var result = url.ExtendQuery(values);
      Assert.That(result, Is.EqualTo(new Uri("/test?param1=new-value&param2=val2", UriKind.Relative)));
    }
  }

দুর্ভাগ্যক্রমে এই সমাধানটি ক্লাউড ব্যবহার করে ASP.NET 5 এর জন্য কাজ করে না H এইচটিটিপি ইউটিলিটি হিসাবে নেট উপলব্ধ বলে মনে হচ্ছে না। তবে এটি অন্যথায় দুর্দান্ত সমাধান। দেখুন stackoverflow.com/questions/29992848/...
diegosasw

1
"Add_to_query_string_dictionary_when_url_contains_hash_and_no_query_string_should_add_values" পরীক্ষা করা উচিত যে URL হয়ে domain.com/test?param1=val1¶m2=val2#div
gliljas

দয়া করে পাল্টা পরীক্ষা, কিনা আপনি ব্যবহার বন্ধ না ভালো আছেন uri.AbsoluteUriপরিবর্তে uri.ToString()কারণ কদর্য আন-পলায়নের প্রভাব।
নিকো

2
সংযোজন: uri.AbsoluteUriছোঁড়া, যদি ইউরি পরম হয় না!
নিকো

19

নোট আপনি Microsoft.AspNetCore.WebUtilitiesমাইক্রোসফ্ট থেকে nuget প্যাকেজ যোগ করতে পারেন এবং তারপরে কোয়েরি স্ট্রিংয়ের মান যুক্ত করতে এটি ব্যবহার করতে পারেন:

QueryHelpers.AddQueryString(longurl, "action", "login1")
QueryHelpers.AddQueryString(longurl, new Dictionary<string, string> { { "action", "login1" }, { "attempts", "11" } });

3
এএসপি.নেট কোর হিসাবে 3.0 ওয়েব ইউটিলিটিগুলি এখন এএসপি.নেট এসডিকে অংশ তাই কোনও ন্যুগেট প্যাকেজের প্রয়োজন নেই।
ব্যবহারকারী 1069816

1
সমস্যাটি AddQueryStringহ'ল এটি সর্বদা যুক্ত হবে, যদি ইতিমধ্যে কী থাকে তবে তা আপডেট হয় না তবে ডুপ্লিকেট কীগুলি তৈরি করে, এটি খারাপ
ভেনকভস্কি

11

নিম্নলিখিত সমাধানটি ASP.NET 5 (vNext) এর জন্য কাজ করে এবং এটি প্যারামিটারগুলির সাথে ইউআরআই তৈরি করতে কোয়েরিহেল্পার ক্লাস ব্যবহার করে।

    public Uri GetUri()
    {
        var location = _config.Get("http://iberia.com");
        Dictionary<string, string> values = GetDictionaryParameters();

        var uri = Microsoft.AspNetCore.WebUtilities.QueryHelpers.AddQueryString(location, values);
        return new Uri(uri);
    }

    private Dictionary<string,string> GetDictionaryParameters()
    {
        Dictionary<string, string> values = new Dictionary<string, string>
        {
            { "param1", "value1" },
            { "param2", "value2"},
            { "param3", "value3"}
        };
        return values;
    }

ফলাফল ইউআরআই হবে http://iberia.com?param1=value1&param2=value2&param3=value3


কোয়েরি কী এবং মানগুলির জন্য স্টোর হিসাবে অভিধান ব্যবহার করার ক্ষেত্রে একমাত্র সমস্যা হ'ল ক্যোরির স্ট্রিংগুলিতে বিভিন্ন মান সহ নকল কী থাকতে পারে। আমি বিশ্বাস করি যে একটি এএসপি.এনইটি সাইটের একটি অনুরোধ সেই এক কীটির মানগুলির একটি অ্যারে হিসাবে পার্স করে।
শেঠ

2

সমস্ত ইউআরএল ক্যোয়ারী স্ট্রিং সম্পাদনার শেষ

প্রচুর পরিশ্রম এবং উরি শ্রেণি এবং অন্যান্য সমাধানগুলির সাথে মশকরা করার পরে, আমার সমস্যাগুলি সমাধান করার জন্য এখানে আমার স্ট্রিং এক্সটেনশন পদ্ধতি।

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

public static class StringExtensions
{
    public static string AddToQueryString(this string url, params object[] keysAndValues)
    {
        return UpdateQueryString(url, q =>
        {
            for (var i = 0; i < keysAndValues.Length; i += 2)
            {
                q.Set(keysAndValues[i].ToString(), keysAndValues[i + 1].ToString());
            }
        });
    }

    public static string RemoveFromQueryString(this string url, params string[] keys)
    {
        return UpdateQueryString(url, q =>
        {
            foreach (var key in keys)
            {
                q.Remove(key);
            }
        });
    }

    public static string UpdateQueryString(string url, Action<NameValueCollection> func)
    {
        var urlWithoutQueryString = url.Contains('?') ? url.Substring(0, url.IndexOf('?')) : url;
        var queryString = url.Contains('?') ? url.Substring(url.IndexOf('?')) : null;
        var query = HttpUtility.ParseQueryString(queryString ?? string.Empty);

        func(query);

        return urlWithoutQueryString + (query.Count > 0 ? "?" : string.Empty) + query;
    }
}

1
ক্লাসটি ইতিমধ্যে stringসেই লক্ষ্যে Uriউপস্থিত রয়েছে তা বিবেচনা করে এই জাতীয় URL উপস্থাপনের জন্য আমি কাঁচা গুলি ব্যবহার করতে নিরুৎসাহিত করব । হয় এটি ব্যবহার করুন, বা বৈশিষ্ট্যগুলি অনুপস্থিত থাকলে একটি নতুন বিমূর্ততা তৈরি করুন।
জুলাইগলন

0

আমি বজর্নের উত্তর পছন্দ করি, তবে তিনি যে সমাধানটি সরবরাহ করেছেন তা বিভ্রান্তিমূলক, কারণ পদ্ধতিটি উপস্থিত না থাকলে এটি যুক্ত করার পরিবর্তে একটি বিদ্যমান প্যারামিটার আপডেট করে .. এটি কিছুটা নিরাপদ করার জন্য, আমি এটি নীচে রূপান্তর করেছি।

public static class UriExtensions
{
    /// <summary>
    /// Adds or Updates the specified parameter to the Query String.
    /// </summary>
    /// <param name="url"></param>
    /// <param name="paramName">Name of the parameter to add.</param>
    /// <param name="paramValue">Value for the parameter to add.</param>
    /// <returns>Url with added parameter.</returns>
    public static Uri AddOrUpdateParameter(this Uri url, string paramName, string paramValue)
    {
        var uriBuilder = new UriBuilder(url);
        var query = HttpUtility.ParseQueryString(uriBuilder.Query);

        if (query.AllKeys.Contains(paramName))
        {
            query[paramName] = paramValue;
        }
        else
        {
            query.Add(paramName, paramValue);
        }
        uriBuilder.Query = query.ToString();

        return uriBuilder.Uri;
    }
}

আমি কোডটি সত্যই একটি প্রান্তিক সম্পাদনা করেছি, আমি এটি সরবরাহ করি নি (ওপি করেছে) ... তবে কী পার্থক্য হবে?

1
যদি / অন্য প্রয়োজন হয় না, কেবল query[paramName] = paramValue;সমস্ত ক্ষেত্রেই করুন। এটি বিদ্যমান, এটি ওভাররাইড করা হবে। যদি এটি বিদ্যমান না থাকে তবে কীটি তৈরি করা হবে।
রিচার্ড

-4

আমার দৃষ্টিভঙ্গি খুব সহজ, নতুনদের জন্য:

// --> Prototype : https://ctrader.guru/?id=1#reload

    public static string AddGetParamToUrl(string url, string pname, string pvalue)
    { 

        pvalue = Uri.EscapeDataString(pvalue);

        if (url.IndexOf("?") > -1)
        {

            url = url.Replace("?", string.Format("?{0}={1}&", pname, pvalue));

        }
        else if (url.IndexOf("#") > -1)
        {

            url = url.Replace("#", string.Format("?{0}={1}#", pname, pvalue));

        }
        else
        {

            url = string.Format("{0}?{1}={2}", url, pname, pvalue);

        }

        return url;

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