Альтернативная строка запроса C # (asp.net) - PullRequest
1 голос
/ 20 января 2009

Существует ли быстрый и грязный способ использования запроса, переданного следующим образом:

domain.com / mypage.aspx / product / toycar /

Я делал это раньше в PHP, но это нужно сделать на странице (в данном случае).

- У меня есть только доступ к странице aspx и коду позади, и я должен работать в asp.net 2 (я хотел бы использовать 3,5)

Ответы [ 5 ]

2 голосов
/ 20 января 2009

быстро и грязно:

public class ModuleRewriter : IHttpModule
{
    public void Init(HttpApplication application)
    {
        application.BeginRequest += (new EventHandler(this.Application_BeginRequest));
    }

    private void Application_BeginRequest(Object source, EventArgs e)
    {
        // The url will look like: http://domain.com/mypage.aspx/product/toycar/ 
        // The module will rewrite it to: http://domain.com/mypage.aspx?product=toycar

        HttpApplication application = source as HttpApplication;
        string[] urlInfo = application.Request.RawUrl.ToString().Split('/');
        if (urlInfo.Length > 2)
        {
            string page = urlInfo[urlInfo.Length - 3];
            string action = urlInfo[urlInfo.Length - 2];
            string id = urlInfo[urlInfo.Length - 1];
            if (string.IsNullOrEmpty(page))
            {
                page = "default.aspx";
            }
            application.Server.Transfer(string.Format(
                "~/{0}?{1}={2}", page, action, id));
        }
    }

    public void Dispose()
    {
    }
}

web.config:

<httpModules>
    <add name="ModuleRewriter" type="ModuleRewriter, MyWebApplication"/>
</httpModules>

и тестовая страница:

<%@ Page Language="C#" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%= Request["product"] %>    
    </div>
    </form>
</body>
</html>
1 голос
/ 20 января 2009

У вас есть несколько вариантов, но все они требуют доступа к web.config и изменениям в IIS для сопоставления всех расширений файлов с dll dotNet ISAPI:

  1. Использовать MVC (как работает stackoverflow, обратите внимание на URL)
  2. Использовать маршрутизацию asp.net (новое в 3.5)
  3. Напишите свой собственный обработчик http Подробное руководство от Microsoft здесь
  4. Используйте превосходный urlrewriting.net , который прекрасно справляется практически со всеми задачами, включая обход неуклюжей аутентификации и проблем с путями к изображениям.

Лично я использовал urlrewriting.net с хорошими результатами.

Поскольку вы упоминаете, что у вас нет доступа ни к чему, кроме кода и страницы, единственное, о чем я могу думать, - это на самом деле создать эти каталоги (если у вас есть доступ для этого) и использовать страницу server.transfer. передавая значение вашей фактической странице в папке выше. Грязно, но если вы не можете получить доступ к другим вещам, ваш выбор ограничен.

1 голос
/ 20 января 2009

Это может включать создание собственного обработчика HTTP.

Проверка это

1 голос
/ 20 января 2009

В случае, если вы просто хотите прочитать путь из вашего .aspx:

Request.ServerVariables [ "PATH_INFO"]

Для уточнения:

он имеет доступ только к самой aspx (+ codebehind), поэтому он должен знать, каков запрос, но его нет в Request.QueryString из-за формата. Таким образом, единственный способ - это Request.ServerVariables ["PATH_INFO"] (Request.RawUrl)

1 голос
/ 20 января 2009

Возможно, вы захотите заглянуть в пространство имен ASP.NET System.Web.Routing, которое было добавлено в .NET 3.5 SP1. Я считаю:

http://blogs.msdn.com/mikeormond/archive/2008/05/14/using-asp-net-routing-independent-of-mvc.aspx

http://msdn.microsoft.com/en-us/library/system.web.routing.aspx

Вы также сможете избавиться от расширения .aspx.

...