2

Web フォームを使用して、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 を表示します。

4.0 フレームワークに登場した経由で解決できるように思えますRouteCollection.MapPageRouteが、どのように使用できるかは不明です。

どんな助けでも大歓迎です。

アップデート。POSTの代わりに使用しても問題ありませんGET。しかし、この方法ではURLは常に次のようになりますhttp://mysite.com/search.aspx

更新 2。フォームはサーバー コントロールである必要があり、送信とテキスト ボックス以外の別のコントロールがあります。それは良いことです (ただし、このパラメーターがブラウザーに表示される URL に表示されない場合は必要ありません。

4

3 に答える 3

1

残念ながら、ASP.NET サーバー フォームで GET 要求を使用すると、常にこれらの「醜い」URL が生成されます。

できることの 1 つは、フォームをサーバー フォームではなく通常のフォームに変更することです。

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

このソリューションの制限の 1 つは、特定の ASP.NET コントロールをこのフォーム内に配置できなくなったことです。たとえば、<asp:Button>コントロールはサーバー フォーム (つまり、サーバー フォームに含まれるフォーム) 内に含まれている必要があるため、このフォームでは機能しませんrunat="server"

于 2010-01-05T02:44:53.137 に答える
0

まあ、それを「見栄えが悪い」ようにしている主な理由は、ViewSate と GET を使用していることです。そうしないでください(ViewSateを無効にしてそれに応じてコードを調整するか、POSTを使用してください)。

ただし、URL の書き換えにも関心があるかもしれません。これにはいくつかの方法があります。私は通常、IIS でワイルドカード マッピングを使用し、Global.asaxファイルに適切な変更を加えます。検索すると、これを行う方法が明らかになります。

于 2010-01-05T02:44:49.453 に答える
0

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>
于 2010-01-05T02:51:47.257 に答える