mvc-カスタムRoute

8547 ワード

public class CustomerRoute : RouteBase
    {
     // controller、action , RouteData( HttpHandler), HttpHandler
public override RouteData GetRouteData(System.Web.HttpContextBase httpContext) { var virtualPath = httpContext.Request.AppRelativeCurrentExecutionFilePath + httpContext.Request.PathInfo;// virtualPath = virtualPath.Substring(2).Trim('/');// URL ~/ca-categoryname, ca-categoryname if (!virtualPath.StartsWith("ca-"))// URL, null, 。 return null; var categoryname = virtualPath.Split('-').Last();// ca- // var category = CategoryManager.AllCategories.Find(c => c.CategoeyName.Equals(categoryname, StringComparison.OrdinalIgnoreCase)); if (category == null)// null, URL, null, return null; // URL var data = new RouteData(this, new MvcRouteHandler());// RouteData, data.Values.Add("controller", "CustomerRoute"); data.Values.Add("action", "ShowCategory"); data.Values.Add("id", category.CategoeyID); return data;// CategoryController.ShowCategory(category.CategoeyID) 。 }
    // RouteValueDictionary url
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values) { // CategoryController.Showcategory(string id), null, var categoryId = values["id"] as string; if (categoryId == null)// id, , null return null; // CategoryController , , null if (!values.ContainsKey("controller") || !values["controller"].ToString().Equals("CustomerRoute", StringComparison.OrdinalIgnoreCase)) return null; // CategoryController.Showcategory(string id) , , null if (!values.ContainsKey("action") || !values["action"].ToString().Equals("showcategory", StringComparison.OrdinalIgnoreCase)) return null; // , CategoryController.Showcategory(string id) , URL var category = CategoryManager.AllCategories.Find(c => c.CategoeyID == categoryId); if (category == null) throw new ArgumentNullException("category");// var path = "ca-" + category.CategoeyName.Trim();// URL return new VirtualPathData(this, path.ToLowerInvariant()); } }