ASP.. NET MVC URL路由,具有层次结构

本文关键字:层次结构 路由 NET MVC URL ASP | 更新日期: 2023-09-27 18:15:26

我试图在ASP中做一些路由。. NET MVC,我希望url基本上看起来像这样的特定区域(AdminArea Section)

http://localhost/admin/folders/folder1/folder2

我想要上面的结构,但是我遇到了一些问题,我无法解决。

第一个问题是,有时URL最终作为一个查询字符串,如

?永久链接= foldername

这不是我想要的。

这是我定义的路由。

            context.MapRoute
        (
                "folder_route",
                "Administration/folders/{*permalink}",
                defaults: new { controller = "folders", action = "Index",permalink = UrlParameter.Optional },
                constraints: new { permalink = new FolderURLConstraint() }
        );

约束:

    public class FolderURLConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
    {
        if (values[parameterName] != null)
        {
            var permalink = values[parameterName].ToString();
            return new FolderDAL().ValidateFolderURLSlug(permalink);
        }
        return false;
    }
}
验证:

        public bool ValidateFolderURLSlug(string folderName)
    {
        if (!string.IsNullOrEmpty(folderName))
        {
            string[] splitFolder = folderName.Split(new string[] { "/"}, StringSplitOptions.RemoveEmptyEntries);
            string lastValue = splitFolder[splitFolder.Length - 1];
            string[] folderNames = GetFolderBreadCrumb(lastValue.ToLower()).Select(p => p.FolderName.ToLower()).ToArray();;
            splitFolder = splitFolder.Select(s => s.ToLower()).ToArray();
            bool isEqual = Enumerable.SequenceEqual(splitFolder, folderNames);
            return isEqual;
        }
        return false;
    }

索引页:@grid。GetHtml(table style: "table -border - table-condensed - table-striped",

    columns:grid.Columns(
            grid.Column("FolderName", "Folder Name",
            format:(item) => Html.ActionLink((string)item.FolderName, "index", "folders", new {permalink=item.FolderName}, null)),
            grid.Column("DateCreated", "Date Created"),
            grid.Column(header:"Action", format:
            @<text>
            <a href="@Url.Action("delete", "Folders", new {id=item.PrimaryKey })"><span class="fa fa-trash"></span></a>
            <a href="@Url.Action("edit", "Folders", new {id=item.PrimaryKey })"><span class="fa fa-edit"></span></a>
            </text>)
        )

)

我想要HTML。ActionLink来生成/folder1/folder2这样的url例如,如果你点击pages文件夹你会得到一个/pages这样的url但是当你点击pages中的home文件夹你会得到一个/pages/home等

我不能得到的工作,也出于某种原因,它似乎添加了querystring后的第一个层次结构下降。

所以在主页上(/folders/)当你点击一个文件夹时你会转到

/页面/

但是文件夹内页(比如home)

将有一个链接,如/folders?回家的永久链接=

但是,如果我输入/pages/home,这仍然有效。

ASP.. NET MVC URL路由,具有层次结构

你好,Agent47,我应该考虑使用另一种方法。

通常我会创建一个自定义处理程序和一个自定义html helper来覆盖html . actionlink。

RouteConfig:

routes.MapRoute(
       "IUrlRouteHandler",
       "{*url}",
       new[] { "YourApp.Controllers" }).RouteHandler = new UrlRouteHandler();
所以,你需要实现一个名为UrlRouteHandler的类,它将接收任何"url",例如http://localhost/admin/folders/folder1/folder2
public sealed class UrlRouteHandler : IRouteHandler
{
     public IHttpHandler GetHttpHandler(RequestContext requestContext)
    {
        var url = requestContext.HttpContext.Request.Url.ToString();
        var routeData = requestContext.RouteData.Values;
        // manage your rules here!
        routeData["controller"] = "YourController";
        routeData["action"] = "YourAction";
        return new MvcHandler(requestContext);
    }
}

使用上面的url变量来管理你的规则,不要忘记提供控制器和动作的名称。你可以在数据库中查看url,在静态类中,拆分所有段来决定应用程序将响应哪个控制器和动作。