是否有可能像财产一样引用方法?像Validate(x => x.Property)

时间:2009-10-05 04:28:57

标签: c# asp.net-mvc strong-typing

因为我需要构建一个非常强类型的& Asp.net MVC的类型安全项目。但是我发现View页面中的很多语法都不是type-safed变量。请看下面的例子。

BeginForm("LogOn", "Account")

而不是

Form.BeginForm(x => Account.LogOn)

是否可以创建类似上面的代码?这是一个非常美妙的强类型源代码。

更新!

我发现表达树是不可能的。请查看以下代码。

仅包含1个操作的Controller类。     公共类Controller1     {         公共视图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()); %>

谢谢,

2 个答案:

答案 0 :(得分:0)

MVC Futures支持这样的东西

您可以从asp.net/mvccodeplex下载并获取源代码作为'手册'

警告:作为'未来'的东西,它可能会在未来的版本中发生变化

答案 1 :(得分:0)

尽管现在可以使用lambda表达式,但在这种情况下它们无法帮助您。让我们看看你的例子:BeginForm方法接受两个字符串作为输入,并且没有任何lambda表达式会改变它。

您可以决定将这些字符串封装为一个或多个类的属性,但由于这个原因,它不会变得更加类型安全

将所有字符串移动到中心位置以减少拼写错误名称的风险可能会有所帮助,但它们仍然是字符串。