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å?
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
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.
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
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.
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)
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å?
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:
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.