Oli*_*old 5 c# asp.net-core asp.net-core-1.0
我需要从提取路径数据(控制器,动作等)的任意请求路径(不与当前请求),如/或/帐户/管理。在以前的Asp.Net Mvc版本中,可以这样实现:
var request = new HttpRequest(null, "http://localhost:3333/Home/About", "testvalue=1");
var response = new HttpResponse(new StringWriter());
var httpContext = new HttpContext(request, response);
var routeData = RouteTable.Routes.GetRouteData(new HttpContextWrapper(httpContext));
var values = routeData.Values;
// The following should be true for initial version of mvc app.
values["controller"] == "Home"
values["action"] == "Index"
Run Code Online (Sandbox Code Playgroud)
此解决方案不是最佳解决方案,因为它需要完全限定的URL,而不仅仅是请求路径。
您可以使用TemplateMatcher
提取路由值:
public class RouteMatcher
{
public static RouteValueDictionary Match(string routeTemplate, string requestPath)
{
var template = TemplateParser.Parse(routeTemplate);
var matcher = new TemplateMatcher(template, GetDefaults(template));
var values = new RouteValueDictionary();
var moduleMatch = matcher.TryMatch(requestPath, values);
return values;
}
// This method extracts the default argument values from the template.
private static RouteValueDictionary GetDefaults(RouteTemplate parsedTemplate)
{
var result = new RouteValueDictionary();
foreach (var parameter in parsedTemplate.Parameters)
{
if (parameter.DefaultValue != null)
{
result.Add(parameter.Name, parameter.DefaultValue);
}
}
return result;
}
}
Run Code Online (Sandbox Code Playgroud)
以及示例用法:
var template = "{controller=Home}/{action=Index}/{id?}";
var routeValues = RouteMatcher.Match(template, "<your path>");
Run Code Online (Sandbox Code Playgroud)
请参阅这篇文章:https ://blog.markvincze.com/matching-route-templates-manually-in-asp-net-core/
归档时间: |
|
查看次数: |
1834 次 |
最近记录: |