gregganMedlem sedan jan. 2004678 inlägg Nu för tiden så använder man ofta /nånting/ istället för att köra på querystring..
ex.
förr
http://www.sida.se/user.aspx?userid=greggan
nu
http://www.sida.se/user/greggan
vad heter detta? eftersom jag inte vet vad det heter så kan jag inte ta reda på mer om det. hur fungerar det osv?
det ska vara så att när man skriver /user/greggan så ska den gå in på sidan user.aspx och hitta greggan. men hur kan jag använda / utan att den letar i en undermapp och så?
emissionMedlem sedan dec. 19996 721 inlägg Det kallas allmänt för URL rewriting.
Metoden bygger på att man i t.ex. ASP.NET kan ändra sökvägen för en request (med metoden RewritePath) innan själva sidan laddas in. Det finns dock vissa krav för att det ska fungera.
1. Man skapar en mapp (fysisk eller virtuell) med sökvägen "/user/greggan", med en default-fil i (default.aspx, index.aspx el. likn). Filen behöver dock inte ha någon som helst funktion i sig. Det enda den behövs till är att hindra "Page not found" och att se till att requesten körs genom ASP.NET.
eller
2. Man fångar upp "Page not found" med en custom 404-sida (ställs in i IIS). Rekommenderas ej.
eller
3. Man installerar ett ISAPI-filter i IIS, som tar hand om omskrivningen av URL:ar
gregganMedlem sedan jan. 2004678 inlägg Okej. Då antar jag att alternativ 3 är att föredra. Är det din åsikt också?
Låter lite jobbigt att det ska skapas en mapp med en fil i för varje användare. Och det där med att ändra 404-sidan vill jag nog inte.
Men då är det altså lämpligt att man inte ligger på ett webbhotell för att det ska gå antar jag eftersom nu när jag ligger på webbhotell så kan jag inte göra några inställningar i IIS.
emissionMedlem sedan dec. 19996 721 inlägg
greggan skrev:
Okej. Då antar jag att alternativ 3 är att föredra. Är det din åsikt också?
Mja, det är helt klart smidigast, men det kräver ju som sagt tillgång till IIS, plus tredjepartsprodukter som kostar lite pengar. Alternativ 1 är helt klart funkis, i synnerhet om man håller funktionerna till en undermapp. Skapandet och raderingen av mappar kan göras från ASP.NET
gregganMedlem sedan jan. 2004678 inlägg okej. jag får titta lite på det. projektet som det ska användas i är knappt påbörjat än så länge så vi vet inte om det kommer ligga på webbhotell eller om det blir på egen server. vet inte heller om det kommer att vara för användare på det viset som jag använde i exemplet.
tack för hjälpen.
Jag avänder filtret som finns på den här sidan
http://weblogs.asp.net/skillet/archive/2004/05/04/125523.aspx
Du behöver inte installera något på servern utan det räcker med lägga till dll:en och lägga till några rader i web.config
DavidBMedlem sedan jan. 20001 372 inlägg Du kan även göra så att adressen blir såhär.
http://www.sida.se/greggan/user.aspx
Då behöver du varken skapa en undermapp eller en default-fil, dock så syns ju filändelsen
Om du nöjer dig med att skriva .aspx i slutet av alla anrop så går det ganska lätt att fixa rewrite i global.asax (du behöver .aspx annars så skickas inte anropet in till "aspx-motorn"... alla filändelser som inte är definerade i IIS'en blir till vanliga anrop till filsystemet)
Exempel: https://www.sida.se/user_greggan.aspx
maqeMedlem sedan dec. 2003824 inlägg jag skulle vilja att urlen såg ut såhär, default___3.aspx t.ex istället för default.aspx?id=3 Går även det att fixa i global.asax på ett enkelt sätt eller är det den hårda vägen som gäller då?
Kör detta i global.asax:
Sub Application_BeginRequest(ByVal sender As Object, ByVal e As EventArgs)
Dim sIncoming As String = Request.Url.Host
Dim sOldpath As String = Request.Url.PathAndQuery
Dim sQueryvalue1 As String = String.Empty
Dim rgRegex As New Regex("default_(.*?).aspx", RegexOptions.IgnoreCase Or RegexOptions.IgnorePatternWhitespace)
Dim colMatches As MatchCollection = rgRegex.Matches(sOldpath )
If colMatches.Count > 0 Then
sQueryvalue1 = colMatches(0).Groups(1).ToString
HttpContext.Current.RewritePath("~/default.aspx?id=" + sQueryvalue1 )
else
HttpContext.Current.RewritePath(sOldpath )
end if
end sub
Det finns dock en liten grejj med detta men som går att fixa till: den sida du hoppar till... om du vill göra en postback på den sidan så används form-taggens action-parameter vilken innehåller den gamla url'en (och som .Net skriver dit själv). Nu har man sån tur att HTML standarden klarar sig utan action-parameter på form-taggen så då får man tillverka en egen form-komponent som man använder istället för aspx-sidans egen form-tag.
Så här kan en sådan egen form komponent se ut:
Imports System
Imports System.Web
Imports System.Web.UI
Namespace Misc.ActionlessForm
Public Class Form
Inherits HtmlControls.HtmlForm
Protected Overrides Sub RenderAttributes(ByVal writer As HtmlTextWriter)
writer.WriteAttribute("name", Me.Name)
MyBase.Attributes.Remove("name")
writer.WriteAttribute("method", Me.Method)
MyBase.Attributes.Remove("method")
Me.Attributes.Render(writer)
MyBase.Attributes.Remove("action")
If Not IsDBNull(MyBase.ID) Then
writer.WriteAttribute("id", MyBase.ClientID)
End If
End Sub
End Class
End Namespace
För att använda dig av ovanstående form-tagg, kör detta längst upp på din aspx sida:
<%@ Register TagPrefix="mittprefix" Namespace="minNameSpace.Misc.ActionlessForm" Assembly="mittAssemlyNamn" %>
och sedan raderar du din form tag och skriver in:
<mittprefix:form id="frm" method="post" runat="server">
Du måste givetvis byta ut "mittAssemlyNamn" och "minNameSpace" mot vad du har i ditt projekt.
maqeMedlem sedan dec. 2003824 inlägg Okay, detta kommer inte fungerar på alla *.aspx filer antar jag? Jag skulle vilja ha ett filter som fungerar på alla *.aspx filer och bara byter ut ?id= mot ___ t.ex.
I mitt exempel ser du en regular expression, alltså ungefär som ett sökuttryck. I exemplet angav jag
default_(.*?).aspx
vilket betyder ordet "default_" följt av valfria tecken/siffror följt av ".aspx".
Detta kan du ju byta ut mot en regexp som motsvarar ditt behov, exempelvis så får du plocka upp värden både framför och bakom ditt "___" tecken och sedan bygga ihop din url med dessa värden.
maqeMedlem sedan dec. 2003824 inlägg Ok, får titta vidare på detta någon gång. Tack för exemplet