Domanda

Sto cercando di sviluppare il mio primo sito in ASP.Net utilizzando Web Form.

Ho una forma con alcuni controlli e un controllo TextBox. Mentre ora uso GETrequest. Quando l'utente invia un modulo proprio browser si aspetta di ottenere URL lungo, qualcosa come

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

se il suo ingresso è una parola sfs in TextBox1. Così ho bisogno di tornare a lui la risposta. Vorrei mostrare questa risposta su un URL facile da usare come

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

o http://mysite.com/sfs

o http://mysite.com/search/sfs

Come posso fare questo? Se uso Response.Redirect, in primo luogo restituisce 302, e solo allora lavorare su URL breve. Server.Transfer non cambia URL e utente vede brutta URL lungo nel browser.

Mi sembra che sia possibile risolvere tramite RouteCollection.MapPageRoute che apparve nel Framework 4.0 ma non è chiaro per me come posso usarlo.

Ogni aiuto è apprezzato.

UPDATE. Non è un problema di utilizzare POST invece di GET. Ma in questo modo URL sarà sempre l'aspetto di http://mysite.com/search.aspx

UPDATE2. Il modulo deve essere il controllo del server e ha un altro controllo ad eccezione di invio e di testo. Sarebbe bene (anche se, ancora, non è necessario se questi parametri non vengono visualizzati in URL che mostra nel browser.

È stato utile?

Soluzione

Fin dalla sua una richiesta GET è anche possibile utilizzare il javascript, impostando il

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

Poi sul lato ASP.NET è possibile utilizzare il riscrittura degli URL funzione per reindirizzare l'URL di una pagina specifica ASPX come parametro di stringa di query.

Fatemi sapere se volete un campione più dettagliata.

Esempio:

Ecco un esempio, si prega di notare non ho ancora testato, ma questo dovrebbe iniziare.

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

Poi sul lato reindirizzamento devi avere un RouteModule in questo modo:

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

E supponendo che il codice si trova nella cartella App_Code si potrebbe usare questo nel tuo 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>

Altri suggerimenti

Utilizzando le richieste GET con forme server ASP.NET, purtroppo, sempre produrrà tali URL "brutto".

Una cosa che si può fare è cambiare la forma di non essere una forma di server e invece essere una forma regolare:

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

Una limitazione di questa soluzione è che non è più possibile inserire alcuni controlli ASP.NET all'interno di questo modulo. Ad esempio, il controllo <asp:Button> non funziona in questa forma perché deve essere contenuto all'interno di un modulo di server (vale a dire, una forma che ha runat="server" su di esso).

Bene, la cosa principale che sta facendo che 'in cattiva', è che si sta utilizzando ViewSate e GET; in modo da non farlo (o disattivare il ViewSate e regolare di conseguenza il codice, o l'uso POST).

Cosa si può anche essere interessati a, tuttavia, è URL ri-scrittura. Si può fare in vari modi, io di solito faccio con una mappatura jolly in IIS e opportune modifiche al file Global.asax. Ricerca rivelerà come fare questo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top