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());
}
}