maysam_p82 Ответов: 1

Как я могу создать короткий url-адрес в ASP.NET веб-форма?


Я создал событие в файле global.asax, чтобы перенаправить его на url , мне это удалось, но я не знаю, почему каждый раз, когда я пишу короткую форму url и перенаправляю на страницу, стили и значки путаются. Например, значок страницы не загрузился! Но когда я использую полный url-адрес формы, все в порядке.

Что я уже пробовал:

<pre> void Application_BeginRequest(Object sender, EventArgs e)
    {
        string originalPath = HttpContext.Current.Request.Path.ToLower();
        if (originalPath.Contains("/employment"))
        {
            originalPath = "~/WebSites/Employment/Employment.aspx";
           
            Context.RewritePath(originalPath,"/employment",string.Empty,false);
           
            
        }

Afzaal Ahmad Zeeshan

Что такое краткая форма URL-адреса?

F-ES Sitecore

Вероятно, вы используете относительные пути к вашим css-файлам и т. д. в html. Используйте что-то вроде Page.ResolveUrl для генерации URL-адресов, а не жестко закодированных относительных путей.

maysam_p82

можете ли вы показать мне пример этого?

1 Ответов

Рейтинг:
4

Richard Deeming

Проблема заключается в относительных URL-адресах. Браузер думает, что он смотрит на /employment, но страница думает, что она смотрит на /WebSites/Employement/Employement.aspx, поэтому он генерирует URL-адреса относительно этого пути. Поскольку они находятся на разных глубинах, относительные URL-адреса, созданные на сервере, не будут работать на клиенте.

Обычно вам нужно переписать URL-адрес обратно в оригинал до того, как страница будет отрисована. Что-то вроде этого должно сработать:

private static readonly object OriginalUrlKey = new object();

void Application_BeginRequest(Object sender, EventArgs e)
{
    string originalUrl = Context.Request.RawUrl;
    if (originalUrl.IndexOf("/employment", StringComparison.OrdinalIgnoreCase) != -1)
    {
        context.Items[OriginalUrlKey] = originalUrl;
        
        string newPath = "~/WebSites/Employment/Employment.aspx";
        Context.RewritePath(newPath, false);
    }
}

void Application_PostMapRequestHandler(object sender, EventArgs e)
{
    var originalUrl = Context.Items[OriginalUrlKey] as string;
    if (originalUrl == null) return;
    
    var page = Context.Handler as Page;
    if (page != null)
    {
        page.PreRenderComplete += Page_PreRenderComplete;
    }
    else
    {
        RestoreUrl(originalUrl);
    }
}

void Page_PreRenderComplete(object sender, EventArgs e)
{
    var originalUrl = Context.Items[OriginalUrlKey] as string;
    if (originalUrl != null) RestoreUrl(originalUrl);
}

void RestoreUrl(string originalUrl)
{
    int index = originalUrl.IndexOf('?');
    if (index != -1) originalUrl = originalUrl.Remove(index);

    Context.RewritePath(originalUrl, false);
    Context.Items.Remove(OriginalUrlKey);
}

Лучшим вариантом было бы использовать встроенные параметры маршрутизации:
Маршрутизация URL-адресов | Microsoft Docs[^]


maysam_p82

большое вам спасибо, но я так и не понял, что же делает ваш метод?:(
и если бы я собирался, что метод ловит, когда я пишу "/занятость" каждый раз, когда на url-адресе, то что я должен делать?
Я хочу, чтобы эта работа, когда пользователь вводит www.website.com/employment

Richard Deeming

Мой метод изменяет URL-адрес обратно на исходный URL-адрес непосредственно перед отображением страницы. Этот должен исправьте относительные URL-адреса в выходных данных.

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

maysam_p82

да , это сработало, большое вам спасибо за вашу помощь