Неверный URL-адрес. Действие при использовании перезаписи URL - PullRequest
16 голосов
/ 27 апреля 2011

Я получаю неверный URL из метода Action, когда использую перезапись URL.

У меня есть это правило перезаписи в web.config:

<rule name="Old Objects 2" stopProcessing="true">
  <match url="^transportbilar/(nya|begagnade|miljobilar)/(.*)$" ignoreCase="true"/>
  <action type="Rewrite" url="/transportbilar/{R:2}"/>
</rule>

Это перезапишет URL, например, /transportbilar/nya/fiat/7s76s8dg на /transportbilar/fiat/7s76s8dg, который работает нормально, но Url.Action запутывается из-за этого.

Я использую подобное выражение для создания URL-адреса на странице:

url.Action("Slideshow", "Object", new { id = objectId });

Если перезапись URL-адреса не используется (переход непосредственно к странице), это приводит к правильному URL-адресу /Object/Slideshow/7s76s8dg, но при использовании перезаписи URL-адреса метод Action добавляет первую часть URL-адреса страницы к сгенерированный URL-адрес и создает неправильный URL-адрес /transportbilar/Object/Slideshow/7s76s8dg.

Я думаю, что вместо этого я могу сделать Redirect в правиле перезаписи, что обойдёт проблему, так как изменился запрашивающий URL, но есть ли способ заставить его работать, не меняя его на Redirect?

Edit:

Маршруты, которые, я думаю, могли бы иметь отношение, следующие (добавлены в следующем порядке):

transportbilar/handlare/{id}/{criteria}
transportbilar/handlare
transportbilar
transportbilar/sokresultat/{criteria}
transportbilar/{brand}/{id}/{criteria}
{controller}/{action}/{id}

Последний маршрут перехватит URL /Object/Slideshow/7s76s8dg, а второй из последних перехватит /transportbilar/fiat/7s76s8dg.

Ответы [ 5 ]

5 голосов
/ 05 мая 2011

Хммм ... не думаю, что я могу помочь вам найти решение, основанное на перезаписи. Я предполагаю, что внутренне IIS / ASP.NET может иметь проблему, с которой вы можете столкнуться, когда пытаетесь взломать сопоставление регулярных выражений в ваших маршрутах - то есть URL.Action не может определить правильное обратное сопоставление из комбинации Controller / Action.

Вы можете проверить, что говорится в вашем URL о вашем URL, и, если это дает вам какие-либо подсказки, в чем заключается проблема ...

<%= Request.Path %>
<%= Request.RawUrl %>
<%= Request.ServerVariables["HTTP_URL"] %>

... чтобы увидеть, добавляется ли `/ transportbilar 'на этом этапе.

В любом случае я бы серьезно отнесся к перенаправлению устаревших URL-адресов. Этот подход изолирует вашу текущую систему от прежней, тем более что кажется, что ваша коллекция маршрутов уже достаточно сложна.

3 голосов
/ 06 мая 2011

Переписывает ли URL-адреса материал для устаревших URL-адресов?

Не могли бы вы отказаться от переписывания URL-адресов и использовать маршрут с ограничениями.Что-то вроде:

routes.MapRoute(
    "OldObject2",
    "transportbilar/{mycondition}/{make}/{id}",
    new { controller = "Object", action = "Slideshow" },
    new
    {
        mycondition = "nya|begagnade|miljobila"
    }
);

Я не совсем точно знаю, что делает ваше приложение, поэтому вышеприведенное может не иметь 100% смысла, но должно дать вам представление о том, что я думаю ...

3 голосов
/ 05 мая 2011

Используйте маршрутизацию вместо перезаписи URL, в конце концов, вы используете MVC.

Проверьте эту статью о маршрутизации:

http://weblogs.asp.net/scottgu/archive/2007/12/03/asp-net-mvc-framework-part-2-url-routing.aspx

1 голос
/ 07 мая 2011

Это сработало для меня (немного позаимствовав из другого ответа):

routes.MapRoute(
    "NewRoute",
    "transportbilar/{make}/{id}",
    new { controller = "Home", action = "Test" }
);
routes.MapRoute(
    "OldRoute",
    "transportbilar/{mycondition}/{make}/{id}",
    new { controller = "Home", action = "Test" },
    new
    {
        mycondition = "nya|begagnade|miljobila"
    }
);

Сначала идет новый, так что вспомогательные методы разрешают его.Но оба переходят к одному и тому же контроллеру и действию.

<p>@Html.ActionLink("link", "Test", new { make = "testmake4", id = 5})</p>

На старых и новых URL-адресах это разрешается до /transportbilar/testmake4/5

0 голосов
/ 20 июня 2019

Вы можете использовать эти функции, чтобы избежать следующих проблем:

    public static string UrlAction(string actionName) {
        return String.Format("/{0}", actionName);
    }

    public static string UrlAction(string actionName, string controllerName) {
        return String.Format("/{0}/{1}", controllerName, actionName);
    }

    public static string UrlAction(string actionName, string controllerName, RouteValueDictionary routeValues) {
        string url = String.Format("/{0}/{1}", controllerName, actionName);

        var parameters = routeValues.Select(s => string.Format("{0}={1}", s.Key, s.Value))
            .Aggregate((current, next) => string.Format("{0}&{1}", current, next));

        return url+"?"+parameters;
    }
...