Server.MapPath со строкой запроса в ASP.NET MVC

После 15 минут гугления я не могу найти решение этой простой проблемы. Так немного помощи?

Приложение размещено в подпапке web веб-сайта, мне нужно сопоставить относительный Uri (это действие Hello в RouteController, которое принимает int и строку в качестве параметров):

"~/Route/Hello/129?name=kennyzx"

to

http://myserver/web/myapplication/Route/Hello/129?name=kennyzx

Если я использую

HttpContext.Current.Server.MapPath("~/Route/Hello/129?name=kennyzx");

Выдается исключение, поскольку вопросительный знак ? является недопустимым символом.

Поэтому мне нужно сначала разделить Uri на две части ~/Route/Hello/129 и ?name=kennyzx, затем MapPath берет первую часть, а Path.Combine объединяет результат MapPath и строку запроса.

Есть ли более простой способ сделать это?

Я понимаю, что использую неправильный API, он фактически заменяется на реальный путь к файлу на моем сервере!

Вот что я пытаюсь сделать:

У меня есть куча относительных uris, и я хочу написать функцию, чтобы расширить их до абсолютных uris на странице Razor.

@{
    ViewBag.Title = "Route Testing";
    var link1 = "/Route/Hello/129?name=kennyzx";
    var link2 = "~/Route/Hello/129?name=kennyzx";
}

@functions{
    private static string GetAbsoluteUri(string link)
    { 
        string absoluteUri = HttpContext.Current.Server.MapPath(link);
        return absoluteUri;
    }
}

<h2>Route Testing</h2>

<a href="@link1">@link1</a><br />
<a href="@link2">@link2</a><br />
<a href="@GetAbsoluteUri(@link2)">@link2</a><br />

Но ни один из вышеперечисленных не дает правильного абсолютного пути.

Первый расширяется до http://myserver/Route/Hello/129?name=kennyzx,

Второй расширяется до http://myserver/web/myapplication/~/Route/Hello/129?name=kennyzx

Третий выдает исключение, и поэтому я задаю этот вопрос.


person kennyzx    schedule 17.07.2018    source источник
comment
Почему вы хотите добавить строку запроса к имени папки? это бессмысленно   -  person Reinstate Monica Cellio    schedule 17.07.2018
comment
это не имя папки, это действие Hello в RouteController, которое принимает int (id) и строку в качестве параметров.   -  person kennyzx    schedule 17.07.2018
comment
Хорошо, Server.MapPath() возвращает папку. Я думаю, вам нужно переосмыслить свой вопрос и уточнить, что вы хотите сделать. Например, Server.MapPath("~/index.html") может вернуть c:\inetpub\wwwroot\index.html   -  person Reinstate Monica Cellio    schedule 17.07.2018
comment
@Арчер Спасибо. Я отредактировал свой вопрос. Теперь я понимаю, что это не тот API. По сути, я просто хочу получить доступ к этой ссылке со страницы Razor, сложность в том, что приложение развернуто не в корне веб-сайта, а в виртуальном каталоге.   -  person kennyzx    schedule 18.07.2018


Ответы (1)


Server.MapPath возвращает фактический путь на сервере, например file:///C:/somefolder/somefile. Он не используется для разрешения относительных URL-адресов.

Оказывается, я ищу @Url.Content для разрешения относительных URL-адресов на странице Razor.

@{
    ViewBag.Title = "Route Testing";
    var link1 = "~/Route/Hello/129?name=kennyzx";
}

<h2>Route Testing</h2>

<a href="@Url.Content(@link1)">@link1</a><br />
person kennyzx    schedule 18.07.2018