2011-02-07 26 views
13

के साथ रिश्तेदार बेसयूरी को मिलाएं मैं एक सापेक्ष बेस उरी को किसी अन्य सापेक्ष पथ के साथ संयोजित करने का एक साफ तरीका ढूंढ रहा हूं। मैंने निम्नलिखित कोशिश की है, लेकिन Uri(Uri, string) और UriBuilder(Uri) को पूर्ण उर की आवश्यकता होती है (अमान्य ऑपरेशन अपवाद: यह ऑपरेशन किसी रिश्तेदार यूआरआई के लिए समर्थित नहीं है)।सापेक्ष पथ

// where Settings.Default.ImagesPath is "~/path/to/images" 
// attempt 1 
_imagePath = new Uri(Settings.Default.ImagesPath, image); 

// attempt 2 
UriBuilder uriBuilder = new UriBuilder(Settings.Default.ImagesPath); 
uriBuilder.Path += image; 
_imagePath = uriBuilder.Uri; 

मुझे यकीन है कि आधार पथ स्लैश के साथ समाप्त होता बनाने के लिए किसी भी बदसूरत स्ट्रिंग परिवर्तन करने के लिए नहीं करना चाहते हैं, आदि

उत्तर

17

यह अभी भी एक सा मेसियर मेरी सोच से है, लेकिन यह काम करता है।

UriBuilder builder = new UriBuilder(); 
Uri baseUri = builder.Uri; 
builder.Path = Settings.Default.ImagesRealtivePath; 
if (!builder.Path.EndsWith("/")) 
    builder.Path += "/"; 
_imagePath = baseUri.MakeRelativeUri(new Uri(builder.Uri, image)); 

यह वापस आ जाएगी:

Uri imageUrl = new Uri("profile.jpg", UriKind.Relative); 
Uri baseImageUrl = new Uri("~/path/to/images", UriKind.Relative); 
Uri combinedImageUrl = baseImageUrl.Combine(image); 

combinedImageUrl ~/path/to/छवियों/profile.jpg

-1

प्रयास करें:

UriBuilder uriBuilder = new UriBuilder(Settings.Default.ImagesRealtivePath); 
uriBuilder.Path += image; 
_imagePath = uriBuilder.Uri; 
+0

यह मेरे प्रयास 2 उदाहरण के समान है। यह "अवैध ऑपरेशन अपवाद: फेंकता है: यह ऑपरेशन किसी रिश्तेदार यूआरआई के लिए समर्थित नहीं है" – jrummell

-3

तुम बस Path.Combine(string, string) उपयोग कर सकते हैं इसे पाने के लिये। यदि यह एक सापेक्ष यूआरएल है तो आउटपुट थोड़ा मजेदार होगा, लेकिन यह सही करने के लिए आसान होगा- या आप इस मुद्दे को आसानी से अनदेखा कर सकते हैं और अधिकतर उपयोग अभी भी काम करना चाहिए।

Path.Combine("~/path/to/images", "image.jpg"); 

आउटपुट: ~/path// करने के लिए छवियों \ image.jpg

+3

क्या इसका कोई कारण डाउनवॉट किया गया है? एक टिप्पणी के बिना downvoting अविश्वसनीय रूप से अनुपयोगी है। –

+2

डाउनवॉटर नहीं था, लेकिन यह आगे के स्लैश के बजाय बैकस्लैश में डालता है, यूआरएल के लिए सही नहीं है। विशेष रूप से उन लिंक वास्तव में मैक पर फ़ायरफ़ॉक्स पर काम नहीं करेंगे। – user12861

+0

पथ। कॉम्बिन स्थानीय फ़ाइल पथों के लिए है, यूआरआई – StuartQ

4

कोशिश है:

public static class UriExtensions 
{ 
    public static Uri Combine(this Uri relativeBaseUri, Uri relativeUri) 
    { 
     if (relativeBaseUri == null) 
     { 
      throw new ArgumentNullException("relativeBaseUri"); 
     } 

     if (relativeUri == null) 
     { 
      throw new ArgumentNullException("relativeUri"); 
     } 

     string baseUrl = VirtualPathUtility.AppendTrailingSlash(relativeBaseUri.ToString()); 
     string combinedUrl = VirtualPathUtility.Combine(baseUrl, relativeUri.ToString()); 

     return new Uri(combinedUrl, UriKind.Relative); 
    } 
} 

यहाँ एक उदाहरण उपयोग है स्ट्रिंग "~/path/to/images/image.jpg"।

1

सबसे पहले, इस पोस्ट पर प्रतिक्रिया के लिए धन्यवाद!

मैंने यूरी कक्षा का उपयोग करने की "जटिलता" को छोड़कर विधि का सरलीकृत संस्करण बनाया। विधि केवल पैरामीटर के रूप में तार लेती है और एक स्ट्रिंग भी लौटाती है।

public static string MakeRelativeUrl(params string[] relativePaths) 
{ 
    var res = "~/"; 
    foreach (var relativePath in relativePaths) 
    { 
     string baseUrl = VirtualPathUtility.AppendTrailingSlash(res); 
     res = VirtualPathUtility.Combine(baseUrl, relativePath); 
    } 
    return res; 
} 

कोड से ऊपर केवल साधारण तार दूसरों जो या तो उरी या VirtualPathUtility पर निर्भर किया जा रहा बिना एक विधि इस कार्यक्षमता उपलब्ध कराने का पर्दाफाश करना चाहता है के लिए उपयोगी है, लेकिन हो सकता है।

Image.ImageUrl = MakeRelativeUrl("path", "to", "images", "image.jpg").ToString(); 
// Image.ImageUrl == "~/path/to/images/image.jpg" 
1

एक से थोड़ा अधिक सामान्यीकृत संस्करण:

public static Uri MakeRelativeUrl(params string[] relativePaths) 
{ 
    var res = "~/"; 
    foreach (var relativePath in relativePaths) 
    { 
     string baseUrl = VirtualPathUtility.AppendTrailingSlash(res); 
     res = VirtualPathUtility.Combine(baseUrl, relativePath); 
    } 
    return new Uri(res, UriKind.Relative); 
} 

ऊपर कोड उदाहरण के दोनों का उपयोग: अभी भी पार्स करने स्ट्रिंग पैरामीटर के लाभ रखने -

निश्चित रूप से आसानी से उरी वापस जाने के लिए संशोधित किया जा सकता है jrummell के उत्तर का है जो पहले पैरामीटर को पूर्ण या एक रिश्तेदार Uri माना जाता है:

/// <summary> 
    /// Combines two <see cref="Uri"/>s. 
    /// </summary> 
    /// <param name="baseUri">Relative or absolute base uri.</param> 
    /// <param name="relativeUri">Uri to be appended.</param> 
    public static Uri Combine(this Uri baseUri, Uri relativeUri) 
    { 
     if (baseUri == null) throw new ArgumentNullException("baseUri"); 
     if (relativeUri == null) throw new ArgumentNullException("relativeUri"); 

     string baseUrl = VirtualPathUtility.AppendTrailingSlash(baseUri.ToString()); 
     string combinedUrl = VirtualPathUtility.Combine(baseUrl, relativeUri.ToString()); 

     return new Uri(combinedUrl, baseUri.IsAbsoluteUri ? UriKind.Absolute : UriKind.Relative); 
    } 
संबंधित मुद्दे