Rendere URL in ASP.Net user-friendly
-
18-09-2019 - |
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 GET
request. 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.
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.