質問

私は、Webフォームを使用してASP.Netでの私の最初のサイトを開発しようとしています。

私はいくつかのコントロールとTextBoxコントロールをフォームに持っています。今、私はGETrequestを使用していますが。ユーザーがフォームを送信すると、彼のブラウザは、長い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を通じて解決することが可能であるように私には思えるが、それは私がそれを使用することができますどのように私には不明です。

すべてのヘルプは高く評価されます。

UPDATE。 POSTの代わりにGET使用する問題ではありません。しかし、この方法でURLが常にhttp://mysite.com/search.aspxのようになります。

アップデート2。フォームは、サーバーコントロールでなければならず、提出し、テキストボックスを除いて、他のコントロールがあります。このパラメータは、ブラウザで表示URLに表示されない場合には、まだ、必要ではないが(良いでしょう。

役に立ちましたか?

解決

そのGETリクエストので、あなたも

を設定し、JavaScriptを使用することができます
location.href = 'http://mysite.com/search/' + query; 

次に、ASP.NET側で、あなたは URL書き換え機能では、クエリ文字列パラメータとして特定のASPXページへのURLをリダイレクトします。

あなたはより詳細なサンプルをご希望の場合は、私に教えてくださいます。

サンプル:

ここではサンプルです、私はそれをテストしていませんが、これはあなたが始める必要がありますのでご注意ください。

<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>

他のヒント

ASP.NETサーバーフォームでGETリクエストを使用すると、残念ながら、常にそれらの「醜い」URLを生成します。

あなたができることの一つは、サーバー形式ではないためにフォームを変更し、代わりに通常の形態である。

<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"制御は、このフォームで動作しません。

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

をしません

あなたはまたに興味がある可能性があり何、しかし、URL書き換えです。あなたはいくつかの方法で、私は一般的にGlobal.asaxファイルにワイルドカードIISのマッピング、適切な変更でそれを行うことを行うことができます。検索はこれを行う方法を明らかにします。

scroll top