我创建了应用程序,其中url生成依赖于数据库值。 我解析这些网址没有任何问题,并从我的路由处理程序中的数据库获取控制器和操作。
但是当我尝试生成网址时,我会遇到麻烦。
在我的情况下,似乎是:视图
@Html.ActionLink("more", MVC.Blog.Post(item.Alias)) // i use T4MVC
MyRouteConstraint
public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
{
if (routeDirection == RouteDirection.UrlGeneration)
{
var data = GetDataFromDbByControllerActionAndParameters(values);
if (data == null)
return false;
var valuesToRemove = new List<string>();
var path = GenerateUrlByData(data, valuesToRemove);
values.Remove("controller");
values.Remove("action");
valuesToRemove.ForEach(v => values.Remove(v)); // remove values that is already used in path
values.Add("all", path) // path = "blog/post/postalias"
return true;
}
// skipped code
}
路线规则
routes.MapRoute("Locations", "{*all}",
constraints: new { all = new LocationConstraints() },
defaults: new { },
namespaces: new []{typeof(BaseController).Namespace}).RouteHandler = new LocationRouteHandler();
因此我得到了像这样的网址
localhost:8553/?Controller=Blog&Action=Post&alias=postalias
但是期待这样
localhost:8553/blog/post/postalias
我该如何生成网址?它应该在哪里?我认为不是在constrant中,而是为什么在这种情况下调用它?
答案 0 :(得分:0)
在我的MVC应用程序中,与您拥有的最接近的路线是下面的路线:
routes.MapRoute(
name: "MyRouteName",
url: "{SomeFolder}/{SomePageName}",
defaults: new { controller = "MyController", action = "Index" },
constraints: new { routeConstraint = new MyRouteConstraint() }
);
可以从数据库修复或更改 SomeFolder
,而SomePageName
将更改为与数据库不同的值。 url
应该是您想要与此路由匹配的任何URL以及将被数据库中的值替换的URL。 defaults
解决了将在MVC循环结束时呈现页面的Controller和Action。 constraints
将导致您描述的匹配方法。
使用此配置,我有www.project.com/SomeFolder/SomePageNameFromDatabase
等网址。