小编给大家分享一下ASP。网络核心中使用表达式树创建URL的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获、下面让我们一起去了解一下吧!
<强>表达式树(表达式树)强>
表达式树是不可执行的代码,它只是用于表示一种树状的数据结构,树上的每一个节点都表示为某种表达式类型,大概有25种表达式类型,它们都派生自表达式类。创建表达式树具体有两个优势:
1。对表达式树的代码进行编辑修改,使表达式树中的代码变成动态代码,根据不同的数据库修改树上的代码逻辑从而达到动态切换数据库查询语句的目的,用表达式树可以动态构建针对不同数据库的查询语句。
2。完成类似反射访问未知对象的属性,通过动态构造表达式树,生成委托。
<强>当我们在ASP。净核心中生成一个行动的url会这样写:强>
var url=_urlHelper.Action (“Index",,“Home");
这样的写法存在的问题在于我们传递了两个字符串类型的参数,而我们又无法避免对行动和控制器做重命名操作,例如将指数重命名为违约,你无法通过IDE在重命名行动的过程中,将
_urlHelper.Action (“Index",,“Home");
重构为
UrlHelper.Action (“Default",,“Home");
所以我们的目标是:设计出具有静态检查的API,让IDE提示出这个错误来,甚至是重命名时直接把相关代码都能重命名。
<强>目标强>
设计出类似两组API:
var url =, _urlHelper.Action ((HomeController c),=祝辞,c.Index ());//期待输出,/home/索引 var link =, _urlHelper.Link ((ProductController c),=祝辞,c.Details (10));//期待输出,http://locahost/product/details/10
<强>设计API 强>
根据上面的需求,定义两组API:
public static string Action(却;能够IUrlHelper 辅助,, Expression 祝辞,动作) where TController :控制器 { ,//实现 } public static  string Link< TController>(却;能够IUrlHelper 辅助,, Expression 祝辞,行动, string protocal =, null,, string host =, null) where TController :控制器 { ,//实现 }
<>强实现API 强>
我们实际上最终还是要依赖ASP。网络核心提供的API:
var link =, helper.Action(动作:,actionName,,控制器:, controllerName,价值观:路线);
所以问题变成了如何根据<代码> (HomeController c)=比;c.Index() 代码>这样的表达式来解析出actionName, ControllerName以及routeValues。
<强> 1。解析ControllerName 强>
解析ControllerName比较简单粗暴,因为我们已经从表达式树中得到了HomeController这个类型,直接回家取字符串即可:
private static string GetControllerName (Type controllerType) { ,var controllerName =, controllerType.Name.EndsWith (“Controller") ,? controllerType.Name.Substring (0, ,controllerType.Name.Length 安康;“Controller" . length) ,:controllerType.Name; ,return controllerName; }
<强> 2。解析ActionName 强>
由于表达式<代码> (HomeController c)=比;c.Index() 代码>是一个MethodCallExpression类型,而行动的名字就是方法名:
private static MethodCallExpression GetMethodCallExpression( Expression 祝辞,actionSelector) { ,var call =, actionSelector.Body as MethodCallExpression; ,if (call ==, null) ,{ ,throw new  ArgumentException(“你must call a method 提醒“,+ typeof (TController) . name,大敌;“actionSelector"); ,} , ,return 调用; } var methodCallExpression =, GetMethodCallExpression(行动); var actionName =, methodCallExpression.Method.Name;
<强> 3。解析RouteValues 强>
上面两步已经解析出了ControllerName和ActionName,也就是说通过上面的分析已经能完成下面的调用:
var action =, helper.Action(行动:,“index",,控制器:,“home",,价值观:,null);//等价于 var url =, _urlHelper.Action ((HomeController c),=祝辞,c.Index ());//输出,/home/指数ASP。网络核心中使用表达式树创建URL的方法