正規表現のルートがルートの制約によって上回っていると思いますか?asp.net mvc regex routes v制約
regex経由のルーティングについてインターネット上に何もありませんか?いくつかの投稿は前のv1よりも前からあるようですが、私は制約を使って同じ目標を達成しています。
正規表現のルートがルートの制約によって上回っていると思いますか?asp.net mvc regex routes v制約
regex経由のルーティングについてインターネット上に何もありませんか?いくつかの投稿は前のv1よりも前からあるようですが、私は制約を使って同じ目標を達成しています。
RegExルートは廃止されました。これを処理するための好ましい方法は、ルート制約によるものです。
RegEx Routesの課題の1つは、URLヘルパー/アクションリンクを使用してページの正しいURLを生成する機能でした。
あなたが見つけた情報は、MVC Betaに関するこのディスカッションです。
public class RegexRoute : Route
{
private readonly Regex _urlRegex;
public RegexRoute(string urlPattern, IRouteHandler routeHandler)
: this(urlPattern, null, routeHandler)
{}
public RegexRoute(string urlPattern, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(null, defaults, routeHandler)
{
_urlRegex = new Regex(urlPattern, RegexOptions.Compiled);
}
public override RouteData GetRouteData(HttpContextBase httpContext)
{
string requestUrl = httpContext.Request.AppRelativeCurrentExecutionFilePath.Substring(2) + httpContext.Request.PathInfo;
Match match = _urlRegex.Match(requestUrl);
RouteData data = null;
if(match.Success)
{
data = new RouteData(this, this.RouteHandler);
// add defaults first
if (null != this.Defaults)
{
foreach (KeyValuePair<string, object> def in this.Defaults)
{
data.Values[def.Key] = def.Value;
}
}
// iterate matching groups
for (int i = 1; i < match.Groups.Count; i++)
{
Group group = match.Groups[i];
if (group.Success)
{
string key = _urlRegex.GroupNameFromNumber(i);
if (!String.IsNullOrEmpty(key) && !Char.IsNumber(key, 0)) // only consider named groups
{
data.Values[key] = group.Value;
}
}
}
}
return data;
}
}
ところで、正規表現として定義されたルートを持つ偉大な「副作用」は、それは一種の不必要な制約の概念をレンダリングされ、その場で検証を実行するために私達にできることです。
はここで正規表現として定義された簡単な例のルートです:今、上記のルートができた、そしておそらく、二つの異なるルートに分割されている必要があります
routes.Add(new RegexRoute(@"^Books/((?<ssn>[\d]{3}(-?)[\d]{2}\1[\d]{4})|(?<query>.+)?)$", new MvcRouteHandler())
{
Defaults = new RouteValueDictionary(new { controller = "Book", action = "Find" })
});
。 1つはSSNで本を探し、もう1つは本のタイトルを検索するためのものですが、私は正規表現を使って得られた柔軟性を実証したかったのです。上記のルートでは、 "mysite.com/Books/Last+Argument+Of+Kings"や "mysite.com/Books/0575077905"のようなURLはBookControllerクラスのFindアクションにマップされ、適切なパラメータは初期化されます:
public class BookController : Controller
{
public void Find(string query, int? ssn)
{
// ... gets the book by ssn if present, otherwise searches using the query
}
}
から取得
http://www.iridescence.no/post/Defining-Routes-using-Regular-Expressions-in-ASPNET-MVC.aspx