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,这仍然有效。
你好,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,在静态类中,拆分所有段来决定应用程序将响应哪个控制器和动作。