代码之家  ›  专栏  ›  技术社区  ›  Soul_Master

是否可以引用类似属性的方法?像validate(x=>x.property)

  •  0
  • Soul_Master  · 技术社区  · 15 年前

    因为我需要为ASP.NET MVC构建一个非常强类型的安全项目。但我发现视图页面中的很多语法都不是类型安全变量。请看下面的例子。

    BeginForm("LogOn", "Account")
    

    而不是

    Form.BeginForm(x => Account.LogOn)
    

    是否可以创建类似于上述代码的内容?这是一个非常好的强类型源代码。

    更新!

    我发现用表情树是不可能的。请看下面的代码。

    仅包含1个操作的控制器类。 公共类控制器1 { 公共视图操作1() { 返回空; } }

    请看表达式代码。

    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);
    }
    

    结果是“控制器1:操作1”!

    更新2!

    以下代码是强类型begin表单的最终代码。

    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 回复  |  直到 15 年前
        1
  •  0
  •   Mark Seemann    15 年前

    尽管lambda表达式现在是可能的,但在这种情况下它们不会帮助您。让我们看看您的示例:BeginInform方法采用两个字符串作为输入,任何数量的lambda表达式都不会改变这一点。

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

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

        2
  •  0
  •   TFD    15 年前

    MVC Futures支持类似的功能

    您可以从下载 asp.net/mvc codeplex 并将源代码作为“手册”获取

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