Переадресация URL + маскирование запускает двойной корневой каталог для Url.Content () и Html.Action () в ASP.NET MVC 3 RC - PullRequest
1 голос
/ 19 ноября 2010

(Примечание: попытался найти похожий вопрос, но, похоже, мой ближайший вопрос по-прежнему не соответствует моему вопросу. Т.е. MVC - корень приложения появляется дважды в URL с помощью Url.Content / Url.Action )

В настоящее время у меня есть два приложения ASP.NET MVC 3 RC, работающие в одном домене, т.е.

mydomain.com / app1

mydomain.com / app2

Теперь, поскольку это отдельное приложение, я зарегистрировался для другого доменного имени и включил переадресацию маски в одно из приложений (т. Е. http://foo.com загрузит http://mydomain.com/app1, а в браузере оно будет толькоshow http://foo.com, not http://mydomain.com/app1)

Ну, вот где MVC начинает получать некоторые жалобы. Оба Url.Content () и Html.Action () генерируют неожиданные URL. Например, в случаеHtml.Action (), если у меня есть @Html.ActionLink("About", "Index", "About"), я ожидаю http://foo.com/about,, но в итоге получаю http://foo.com/app1/about

, потому что http://foo.com/app1/about переводится в http://mydomain.com/app1/app1/about,очевидно, что ссылка не будет работать.

Аналогично, для Url.Content, если у меня есть href="@Url.Content("~/Content/Site.css")", браузер не сможет загрузить файл.ylesheet, потому что он думает, что местоположение находится в http://foo.com/app1/Content/Site.css, вместо http://foo.com/Content/Site.css

Есть ли способ, я могу заставить MVC забыть о своем начальном каталоге (т.е. удалить " app1 /"из сгенерированного URL?)

Спасибо за чтение, и, пожалуйста, дайте мне знать, если здесь нужна дополнительная информация.

1 Ответ

0 голосов
/ 19 ноября 2010

Прямо сейчас есть обходные пути.

Для Url.Content () мы просто удалим «~» из Url.Content("~/..."), чтобы избавиться от этого относительного пути (т.е. / app1 )

Что касается Html.ActionLink (), решение кажется грязным, поскольку всегда предполагается относительный путь, поэтому обходной путь здесь временный. У кого-нибудь есть лучшее решение?

public static MvcHtmlString ActionLinkAbsolute(
                    this HtmlHelper<dynamic> htmlHelper, string linkText, string actionName, string controllerName)
                {
                    MvcHtmlString result = LinkExtensions.ActionLink(htmlHelper, linkText, actionName, controllerName);
                    result = new MvcHtmlString(result.ToHtmlString().Replace(VirtualPathUtility.ToAbsolute("~"), String.Empty)); 
                    return result;
                }

Обходной путь здесь не без его последствий. Чтобы поддерживать маскирование URL-адресов и игнорировать относительный путь, http://mydomain.com/app1 не будет генерировать ожидаемую ссылку, поскольку он всегда удаляет относительный путь. Это не идеально, но я могу жить с недостатком.

...