虽然我同意你应该在可用时使用受支持的库,而不是滚动你自己的,我认为值得分享,实际上它实现RedirectToAction实际上是非常有前途的。下面的代码当然不是完整的,但总体思路是成立的,可以用来将许多基于反射的逻辑转化为类型安全逻辑。
string ActionLink<TController, T>(Expression<Func<TController,T>> actionExpression, bool useQueryString = false)
{
var controllerName = typeof(T).Name;
const string controllerPostfix = "Controller";
if (controllerName.EndsWith(controllerPostfix, StringComparison.InvariantCultureIgnoreCase))
{
controllerName = controllerName.Substring(0, controllerName.Length - controllerPostfix.Length);
}
var expBody = (MethodCallExpression)actionExpression.Body;
var method = expBody.Method;
var parameters = method.GetParameters().ToArray();
var arguments = string.Empty;
if (useQueryString){
arguments = GetQuerystring(expBody, parameters);
} else{
if (parameters.Length > 0)
{
arguments = "/" + string.Join
("/",
expBody.Arguments.Select
((arg, i) => string.Format("{0}",GetValue(arg))).
ToArray());
}
}
return "~/" + controllerName + "/" + expBody.Method.Name + arguments;
}
正如我所说的上述不处理(使用被排除为了简洁和两种方法)所有的可能性。 并有预期的用户表现不错没有任何错误处理,但上面的代码能够写
ActionLink的((myController的C => c.ShowMeTheMoney(ThreatenWithGun:假的,怒吼:真));
可能并返回“〜/ My/ShowMeTheMoney/false/true”。因此,在需要时将类型安全表达式转换为字符串(或任何其他格式)并不需要太多努力,而且大部分需要做的事情可以在完全不同的场景之间重复使用(例如上面使用的GetValue方法,该方法能够遍历表达式树来获取表达式树表示的值)
正是我所期待的 - 谢谢! – Illuminati 2011-06-07 06:58:16