Path.Combine для URL?

Как насчет этого решения?

Просто добавьте атрибут данных «data-type = editable» в тег изображения следующим образом:


И сценарий к вашему проекту выкл ...

function init() {
    $("img[data-type=editable]").each(function (i, e) {
        var _inputFile = $('')
            .attr('type', 'file')
            .attr('hidden', 'hidden')
            .attr('onchange', 'readImage()')
            .attr('data-image-placeholder', e.id);

        $(e.parentElement).append(_inputFile);

        $(e).on("click", _inputFile, triggerClick);
    });
}

function triggerClick(e) {
    e.data.click();
}

Element.prototype.readImage = function () {
    var _inputFile = this;
    if (_inputFile && _inputFile.files && _inputFile.files[0]) {
        var _fileReader = new FileReader();
        _fileReader.onload = function (e) {
            var _imagePlaceholder = _inputFile.attributes.getNamedItem("data-image-placeholder").value;
            var _img = $("#" + _imagePlaceholder);
            _img.attr("src", e.target.result);
        };
        _fileReader.readAsDataURL(_inputFile.files[0]);
    }
};

// 
// IIFE - Immediately Invoked Function Expression
// https://stackoverflow.com/questions/18307078/jquery-best-practises-in-case-of-document-ready
(

function (yourcode) {
    "use strict";
    // The global jQuery object is passed as a parameter
    yourcode(window.jQuery, window, document);
}(

function ($, window, document) {
    "use strict";
    // The $ is now locally scoped 
    $(function () {
        // The DOM is ready!
        init();
    });

    // The rest of your code goes here!
}));

См. демонстрацию в JSFiddle

1146
задан Peter Mortensen 3 February 2015 в 15:01
поделиться

9 ответов

Вы используете Uri.TryCreate( ... ):

Uri result = null;

if (Uri.TryCreate(new Uri("http://msdn.microsoft.com/en-us/library/"), "/en-us/library/system.uri.trycreate.aspx", out result))
{
    Console.WriteLine(result);
}

возвратится:

http://msdn.microsoft.com/en-us/library/system.uri.trycreate.aspx

140
ответ дан Ryan Cook 3 February 2015 в 15:01
поделиться

Если Вы не хотите добавлять стороннюю зависимость, такую как Flurl или создавать пользовательский дополнительный метод в Ядре ASP.NET (также доступный в Microsoft. Owin), можно использовать PathString, который предназначается в целях создания путей URI. Можно тогда создать полный URI с помощью комбинации этого, Uri и UriBuilder.

В этом случае, это было бы:

new Uri(new UriBuilder("http", "MyUrl.com").Uri, new PathString("/Images").Add("/Image.jpg").ToString())

Это дает Вам все составные части, не имея необходимость определять разделители в базовом URL. К сожалению, PathString требует, чтобы / предварительно ожидался к каждой строке иначе, она на самом деле бросает ArgumentException! Но по крайней мере можно создать URI детерминировано способом, который является легко тестируемым единицей.

1
ответ дан Neo 29 August 2019 в 16:16
поделиться

Остроумный пример, Райан, в конце ссылки на функцию. Отлично.

Одна рекомендация, Брайан: если вы заключите этот код в функцию, вы можете использовать UriBuilder, чтобы обернуть базовый URL-адрес перед вызовом TryCreate.

В противном случае базовый URL-адрес ДОЛЖЕН включать схему ( где UriBuilder примет http: //). Просто подумайте:

public string CombineUrl(string baseUrl, string relativeUrl) {
    UriBuilder baseUri = new UriBuilder(baseUrl);
    Uri newUri;

    if (Uri.TryCreate(baseUri.Uri, relativeUrl, out newUri))
        return newUri.ToString();
    else
        throw new ArgumentException("Unable to combine specified url values");
}
12
ответ дан 19 December 2019 в 20:14
поделиться

Это может быть достаточно простое решение:

public static string Combine(string uri1, string uri2)
{
    uri1 = uri1.TrimEnd('/');
    uri2 = uri2.TrimStart('/');
    return string.Format("{0}/{1}", uri1, uri2);
}
145
ответ дан 19 December 2019 в 20:14
поделиться

Uri имеет конструктор, который должен сделать это за вас: new Uri (Uri baseUri, string relativeUri)

Вот пример:

Uri baseUri = new Uri("http://www.contoso.com");
Uri myUri = new Uri(baseUri, "catalog/shownew.htm");

Примечание редактора: Остерегайтесь, этот метод не работает должным образом. В некоторых случаях он может вырезать часть baseUri. См. Комментарии и другие ответы.

1121
ответ дан 19 December 2019 в 20:14
поделиться

Основываясь на примере URL, который вы предоставили, я собираюсь предположить, что вы хотите объединить URL, которые являются относительными для вашего сайта.

Исходя из этого предположения, я предложу это решение как наиболее подходящий ответ на ваш вопрос, который звучал следующим образом: "Path.Combine удобен, есть ли подобная функция во фреймворке для URL?"

Поскольку есть подобная функция во фреймворке для URL, я предлагаю правильное решение: "Метод VirtualPathUtility.Combine". Вот ссылка на MSDN: Метод VirtualPathUtility.Combine

Есть одна оговорка: я считаю, что этот метод работает только для URL относительно вашего сайта (то есть вы не можете использовать его для генерации ссылок на другой сайт. Например, var url = VirtualPathUtility.Combine("www.google.com", "accounts/widgets");)

34
ответ дан 19 December 2019 в 20:14
поделиться

Ответ Райана Кука близок к тому, что мне нужно, и может быть более подходящим для других разработчиков. Однако он добавляет http: // в начало строки и, как правило, выполняет немного большее форматирование, чем я после.

Кроме того, для моих вариантов использования разрешение относительных путей не важно.

Ответ mdsharp также содержит семя хорошей идеи, хотя для фактической реализации требовалось несколько дополнительных деталей. Это попытка конкретизировать его (и я использую это в производстве):

C #

public string UrlCombine(string url1, string url2)
{
    if (url1.Length == 0) {
        return url2;
    }

    if (url2.Length == 0) {
        return url1;
    }

    url1 = url1.TrimEnd('/', '\\');
    url2 = url2.TrimStart('/', '\\');

    return string.Format("{0}/{1}", url1, url2);
}

VB.NET

Public Function UrlCombine(ByVal url1 As String, ByVal url2 As String) As String
    If url1.Length = 0 Then
        Return url2
    End If

    If url2.Length = 0 Then
        Return url1
    End If

    url1 = url1.TrimEnd("/"c, "\"c)
    url2 = url2.TrimStart("/"c, "\"c)

    Return String.Format("{0}/{1}", url1, url2)
End Function

Этот код проходит следующий тест, который находится в VB:

<TestMethod()> Public Sub UrlCombineTest()
    Dim target As StringHelpers = New StringHelpers()

    Assert.IsTrue(target.UrlCombine("test1", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("test1/", "/test2") = "test1/test2")
    Assert.IsTrue(target.UrlCombine("/test1/", "/test2/") = "/test1/test2/")
    Assert.IsTrue(target.UrlCombine("", "/test2/") = "/test2/")
    Assert.IsTrue(target.UrlCombine("/test1/", "") = "/test1/")
End Sub
87
ответ дан 19 December 2019 в 20:14
поделиться

Простой способ объединить их и обеспечить постоянную корректность:

string.Format("{0}/{1}", Url1.Trim('/'), Url2);
10
ответ дан 19 December 2019 в 20:14
поделиться

Я должен указать, что Path.Combine , похоже, работает и для этого напрямую, по крайней мере, на .NET 4.

-1
ответ дан 19 December 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: