[英]ASP.NET MVC Page-URL and Controller/Action Routing
我在构建允许两种路由的ASP.NET MVC页面时遇到问题。
我有一个数据库,其中所有页面都使用url-path来存储,例如: / Site1 / Site2 / Site3我尝试在我的第一条路线中使用IRouteConstraint来检查请求的站点是否是我数据库中的站点( permalink )。
在第二种情况下,我想使用默认的asp.net mvc {controller} / {action}功能,以便从* .cshtml提供简单的访问。
现在我不知道这是否是最好的方法。 此外,我还有问题,如何以IRouteContraint为根。
有人对此有经验吗?
我正在使用asp.net mvc 5。
问题解决,最终解决方案:
添加这两个路由:
routes.MapRoute( "FriendlyUrlRoute", "{*FriendlyUrl}" ).RouteHandler = new FriendlyUrlRouteHandler(); routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Page", action = "Load", id = UrlParameter.Optional }, namespaces: controllerNamespaces.ToArray() );
我自己的Route-Handler:
public class FriendlyUrlRouteHandler : System.Web.Mvc.MvcRouteHandler { protected override IHttpHandler GetHttpHandler(System.Web.Routing.RequestContext requestContext) { var friendlyUrl = (string)requestContext.RouteData.Values["FriendlyUrl"]; WebPageObject page = null; if (!string.IsNullOrEmpty(friendlyUrl)) { page = PageManager.Singleton.GetPage(friendlyUrl); } if (page == null) { page = PageManager.Singleton.GetStartPage(); } // Request valid Controller and Action-Name string controllerName = String.IsNullOrEmpty(page.ControllerName) ? "Page" : page.ControllerName; string actionName = String.IsNullOrEmpty(page.ActionName) ? "Load" : page.ActionName; requestContext.RouteData.Values["controller"] = controllerName; requestContext.RouteData.Values["action"] = actionName; requestContext.RouteData.Values["id"] = page; return base.GetHttpHandler(requestContext); } }
您可以使用属性的路由是在MVC 5并结合属性与基于常规路由的路由来检查你想在控制器类或动作方法的条件。
您可以自己创建约束,以将其用于以下操作方法:
public class ValuesConstraint : IRouteConstraint
{
private readonly string[] validOptions;
public ValuesConstraint(string options)
{
validOptions = options.Split('|');
}
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
object value;
if (values.TryGetValue(parameterName, out value) && value != null)
{
return validOptions.Contains(value.ToString(), StringComparer.OrdinalIgnoreCase);
}
return false;
}
}
要使用属性路由,您只需要在配置期间调用MapMvcAttributeRoutes
,然后再调用常规约定路由即可。 您还应该在映射属性之前添加约束,例如以下代码:
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var constraintsResolver = new DefaultInlineConstraintResolver();
constraintsResolver.ConstraintMap.Add("values", typeof(ValuesConstraint));
routes.MapMvcAttributeRoutes(constraintsResolver);
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
);
}
现在,在您的控制器类上,您可以检查路由并决定如何处理不同的URL,如下所示:
例如:// / mysite / Site1和/ mysite / Site2,但不是/ mysite / Site3
[Route("mysite/{site:values(Site1|Site2)}")]
public ActionResult Show(string site)
{
return Content("from my database " + site);
}
您也可以只对控制器类进行各种检查。
我希望这会给您一些线索,以实现您想要的目标。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.