Сделать URL в ASP.Net удобным для пользователей - PullRequest
2 голосов
/ 05 января 2010

Я пытаюсь разработать свой первый сайт в ASP.Net с использованием веб-форм.

У меня есть форма с некоторыми элементами управления и элементом управления TextBox. Пока я использую GET запрос. Когда пользователь отправляет форму, его браузер ожидает получить длинный URL, что-то вроде

http://mysite.com/search.aspx?__VIEWSTATE=%2FwEPDwUJNTE2NjY5jMY4D2QWAgICD2QWAgIDDW8wAh4EVGV4dAUBMWRkZKthQ0zeIP5by49qIHwSuW6nOj8iLTdoCUzpH369xyg8&__EVENTVALIDATION=%2FwEWAwLnrcHhBQLs0bLrBgKM54rGBjGtX5fJOylLy4qRbt6DqPxO%2FnfcMOkHJBRFqZTZdsBD&TextBox1=sfs&Button1=Button

, если его вводом является слово sfs в TextBox1. Поэтому мне нужно вернуть ему ответ. Я хотел бы показать этот ответ на удобном для пользователя URL-адресе, например

http://mysite.com/search.aspx?TextBox1=sfs

или http://mysite.com/sfs

или http://mysite.com/search/sfs

Как я могу это сделать? Если я использую Response.Redirect, он сначала возвращает 302, а только потом работает по короткому URL. Server.Transfer не меняет URL, и пользователь видит в браузере ужасный длинный URL.

Мне кажется, что можно решить с помощью RouteCollection.MapPageRoute, который появился в 4.0 Framework, но мне неясно, как я могу его использовать.

Любая помощь приветствуется.

UPDATE. Нет проблем с использованием POST вместо GET. Но при этом URL всегда будет выглядеть так: http://mysite.com/search.aspx

UPDATE2. Форма ДОЛЖНА быть серверным элементом управления и имеет другие элементы управления, кроме submit и textbox. Было бы хорошо (хотя, тем не менее, не обязательно, если эти параметры не отображаются в URL, отображаемом в браузере.

Ответы [ 3 ]

1 голос
/ 05 января 2010

Использование запросов GET с серверными формами ASP.NET, к сожалению, всегда будет приводить к этим "уродливым" URL-адресам.

Одна вещь, которую вы можете сделать, это изменить форму, чтобы она не была серверной, а вместо этого была обычной:

<form method="get" action="Search.aspx">
    <input type="text" name="query" />
    <input type="submit" name="SearchButton" value="Search" />
</form>

Одним из ограничений этого решения является то, что вы больше не можете помещать определенные элементы управления ASP.NET в эту форму.Например, элемент управления <asp:Button> не будет работать в этой форме, поскольку он должен содержаться в форме сервера (то есть в форме, содержащей runat="server").

0 голосов
/ 05 января 2010

Так как это запрос GET, вы также можете использовать javascript, установив

location.href = 'http://mysite.com/search/' + query; 

Затем на стороне ASP.NET вы можете использовать функцию перезаписи URL , чтобы перенаправить этот URL-адрес на определенную страницу ASPX в качестве параметра строки запроса.

Дайте мне знать, если вы хотите более подробный образец.

Пример:

Вот пример, обратите внимание, я не проверял его, но это должно помочь вам начать.

<html>
<head>
  <script type="text/javascript">
    function searchRedirect()
    {
      var query = $get('query');
      location.href = "/search/" + query.value;
    }
  </script>
</head>
<body>
    <div class="search">
        <input type="text" id="query" /><br />
        <input type="button" id="search" value="Search" onclick="searchRedirect();" />
    </div>
</body>
</html>

Тогда на стороне перенаправления у вас есть RouteModule, подобный этому:

public class UrlRewriter : IHttpModule
{
    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
        context.AuthorizeRequest += new EventHandler(OnBeginRequest); //this ensures the login page has the vitual url not the mapped url
    }


    private void OnBeginRequest(object sender, EventArgs e)
    {
        var application = sender as HttpApplication;
        if (application != null)
        {
            var requestPath = application.Request.AppRelativeCurrentExecutionFilePath;
            if (requestPath.ToLower().StartsWith("/search/"))
            {
                var query = requestPath.Substring(8);
                application.Context.RewritePath("Search.aspx", null, "query=" + query, false);
            }
            // .. Other Routes
        }
    }
}

И, предполагая, что код находится в вашей папке App_Code, вы можете использовать это в своем файле web.config

<system.web>
  <!-- ... -->
  <httpModules>
      <add name="UrlRewriter" type="UrlRewriter, __code"/>
  </httpModules>
</system.web>

<!-- If IIS7 -->
<system.webServer>
  <modules>
    <add name="UrlRewriter" type="UrlRewriter, __code" />
  </modules>
</system.webServer>
0 голосов
/ 05 января 2010

Что ж, главное, что «плохо выглядит», это то, что вы используете ViewSate и GET; так что не делайте этого (либо отключите ViewSate и измените код соответствующим образом, либо используйте POST).

Однако вас также может заинтересовать перезапись URL. Вы можете сделать это несколькими способами, я обычно делаю это с помощью подстановочного сопоставления в IIS и соответствующих изменений в файле Global.asax. Поиск покажет, как это сделать.

...