これってデフォルト値と同じパラメータを省略(後方に有効値パラメータ無しの場合)させずに、URLを取得出来るようになればいい、っていう問題だったり?
routes.MapRoute( "Default", // Route name "{controller}/{action}/{id}", // URL with parameters new { controller = "Home", action = "Index", id = "" } // Parameter defaults );
↑こういう登録をしてる場合に、
var url1 = Url.RouteUrl("default"); var url2 = Url.RouteUrl("default", new { controller="Home" }); var url3 = Url.RouteUrl("default", new { controller = "Home", action="Index" });
↑これは全部"/"と出力されるけど、これが"/Home/Index"になって欲しい、と。違うなら意味なくなっちゃうからそういう質問だと仮定。
やっぱりRouteクラスを派生させてGetVirtualPathのoverrideでしょ!
public class FullRoute : Route { public FullRoute(string url, IRouteHandler routeHandler):
base(url, routeHandler) { } public FullRoute(string url, RouteValueDictionary defaults,
IRouteHandler routeHandler):
base(url, defaults, routeHandler) { } public FullRoute(string url, RouteValueDictionary defaults,
RouteValueDictionary constraints, IRouteHandler routeHandler):
base(url, defaults, constraints, routeHandler) { } public FullRoute(string url, RouteValueDictionary defaults,
RouteValueDictionary constraints, RouteValueDictionary dataTokens,
IRouteHandler routeHandler):
base(url, defaults, constraints, dataTokens, routeHandler) { } public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { var dict = new RouteValueDictionary(Defaults); values.ToList().ForEach(kv=>dict[kv.Key] = kv.Value); var url = Url; dict.ToList().ForEach(kv => url = url.Replace(string.Format("{{{0}}}", kv.Key), (string)kv.Value)); url = Regex.Replace(url, @"{([\w].+)?}", ""); url = Regex.Replace(url, @"(\/){2,}", ""); var path = base.GetVirtualPath(requestContext, values); path.VirtualPath = url; return path; } }
※途中のパラメータが空白の時は考慮してないのであしからず。なんかthrowすべきだよね~。
これを使うようにRouteTableに追加。
routes.Add("FullDefault", new FullRoute( "{controller}/{action}/{id}/{foo}/{bar}", new RouteValueDictionary(new { controller = "Home", action = "Index", id = "", foo = "", bar = "" }), new RouteValueDictionary(), new MvcRouteHandler() ));
※idより後ろのパラメータは特に意味なしデス。
そうすると
var full1 = Url.RouteUrl("fulldefault"); var full2 = Url.RouteUrl("fulldefault", new { controller = "Home" }); var full3 = Url.RouteUrl("fulldefault", new { controller = "Home", action = "Index" });
これが全部"/Home/Index"を返すようになります。
こういう事でいいんですかね?って英語でどうやって答えればいいのか分からない...。