因为我需要为 Asp.net MVC 构建一个非常强类型和类型安全的项目。但是我发现 View 页面中的很多语法都不是类型安全的变量。请看下面的例子。
BeginForm("LogOn", "Account")
代替
Form.BeginForm(x => Account.LogOn)
是否可以创建类似上述代码的内容?这是一个非常漂亮的强类型源代码。
更新!
我发现表达式树是不可能的。请看下面的代码。
仅包含 1 个操作的控制器类。公共类 Controller1 { public View Action1() { return null; } }
请看表达式代码。
Expression<Action<Controller1>> exp1 = (c => c.Action1());
Expression part = exp1.Body;
if (part.NodeType == System.Linq.Expressions.ExpressionType.Call)
{
MethodCallExpression callExpression = (MethodCallExpression)part;
MessageBox.Show(callExpression.Method.DeclaringType.Name + " : " + callExpression.Method.Name);
}
结果是“Controller1:Action1”!
更新2!
以下代码是强类型开始形式的最终代码。
public static MvcForm BeginForm<BaseController>(this HtmlHelper htmlHelper, Expression<Action<BaseController>> routeExp)
{
Expression part = routeExp.Body;
if (part.NodeType == System.Linq.Expressions.ExpressionType.Call)
{
MethodCallExpression callExpression = (MethodCallExpression)part;
MethodInfo actionMethod = callExpression.Method;
return htmlHelper.BeginForm(actionMethod.Name, actionMethod.DeclaringType.Name);
}
throw new Exception();
}
因此,您可以使用以下模式调用它。
<% Html.BeginForm<HomeController>(x => x.Index()); %>
谢谢,