我正在努力改变
@{Html.RenderAction("Foo", "TheAction");}
至
@{Html.RenderAction((FooController c) => c.TheAction );}
这在很多方面都更好,它改进了:
- F12-导航
- 类型使用检测(resharper 等)
- 方法使用检测
- 严格
- ...使死链接远离项目的可能性
...所以我写了一个这样的扩展类:
using System;
using System.Linq.Expressions;
using System.Reflection;
using System.Text.RegularExpressions;
using System.Web.Mvc;
using System.Web.Mvc.Html;
namespace V3NET.MVC.Extensions
{
public static class HtmlHelperExtension
{
public static void RenderAction<T>
(this HtmlHelper helper, Expression<Func<T, Func<int, int?, ActionResult>>> action)
{
var actionName =
(
(MethodInfo)
(
(ConstantExpression)
(
(MethodCallExpression)
(
((UnaryExpression)action.Body).Operand
)
).Object
).Value
).Name;
var controllerType = action.Parameters[0].Type;
var controllerName = new Regex("Controller$").Replace(controllerType.Name, "");
helper.RenderAction(actionName, controllerName);
}
}
}
...但是正如您所看到的,我必须针对采取 int, int? 作为论据。
我如何更一般地表达这一点,这样我就不必编写无数的重载?