1

global.asax にこの MapPageRoute があります。

RouteTable.Routes.MapPageRoute("TestPages", "{file}", "~/Test/{file}");

基本的に、要求がファイルに対して来ると、Test フォルダーに移動します。ただし、URL に asp 拡張子がない場合にのみこのルールが実行されるように制限したいと思います。したがって、ユーザーが Test.asp と入力しても、URL ルーティングは発生しません。しかし、http://www.something.com/Test/このルートのようなものであれば実行する必要があります。

どうすればそれを達成できますか?

4

2 に答える 2

2

この目的のために制約を使用します。例:

routes.MapPageRoute("CMS", "{*friendlyUrl}", "~/index.aspx", true, null, new RouteValueDictionary { { "incomingUrl", new CatchallConstraint() } });

CatchallContraint は、IRouteConstraint を実装する必要があるクラスです。

Match メソッドでは、ファイル拡張子を確認し、asp 拡張子の場合は false を返します。

これが私の実装(vb.net)です-web.configで構成できるため、必要以上ですが、アイデアはわかります。

パブリック クラス CatchallConstraint は System.Web.Routing.IRouteConstraint を実装します

''' <summary>
''' If AppSettings: CatchallIgnoredExtensions doesn't exist, these are the default extensions to ignore in the catch-all route
''' </summary>
''' <remarks></remarks>
Public Const DefaultIgnoredExtensions As String = ".jpg,.gif,.png"

''' <summary>
''' For the catch-all route, checks the AppSettings: CatchallIgnoredExtensions to determine if the route should be ignored.
''' Generally this is for images - if we got to here that means the image was not found, and there's no need to follow this route
''' </summary>
Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
    If routeDirection = Routing.RouteDirection.IncomingRequest Then
        Dim friendlyUrl As String = Nothing
        If values.TryGetValue("friendlyUrl", friendlyUrl) AndAlso Not String.IsNullOrEmpty(friendlyUrl) Then
            If friendlyUrl.Contains(".") Then
                Dim catchallIgnoredExtensions As String = ConfigurationManager.AppSettings("CatchallIgnoredExtensions")
                ' only set defaults if the setting is not found - user may not want to ignore any extensions
                If catchallIgnoredExtensions Is Nothing Then
                    catchallIgnoredExtensions = DefaultIgnoredExtensions
                End If
                ' replace spaces and period to standardize, surround the extensions in commas for searching
                catchallIgnoredExtensions = "," & catchallIgnoredExtensions.Replace(" ", "").Replace(".", "").ToLowerInvariant() & ","
                Dim extension As String = System.IO.Path.GetExtension(friendlyUrl).Replace(".", "")
                If catchallIgnoredExtensions.Contains("," & extension & ",") Then
                    Return False
                End If
            End If
        End If
    End If
    Return True
End Function

クラス終了

于 2012-04-19T13:16:19.827 に答える
2

ルートを無視するには、次を使用してみてください。

RouteTable.Routes.Ignore("{resource}.asp/{*pathInfo}");

「.asp」をフィルタリングするタイプに変更します。

于 2012-04-19T13:52:32.120 に答える