【问题标题】:Is it possible to refer method like property? Like Validate(x => x.Property)是否可以引用属性之类的方法?像 Validate(x => x.Property)
【发布时间】:2010-12-03 20:19:24
【问题描述】:

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

BeginForm("LogOn", "Account")

而不是

Form.BeginForm(x => Account.LogOn)

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

更新!

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

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

请看表达式代码。

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()); %>

谢谢,

【问题讨论】:

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


    【解决方案1】:

    虽然现在可以使用 lambda 表达式,但在这种情况下它们不会对您有所帮助。让我们看看您的示例:BeginForm 方法将两个字符串作为输入,再多的 lambda 表达式都不会改变它。

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

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

    【讨论】:

    • 如你所说,我只是试试。这是可能的,所以我将创建一些帮助类来解决这个问题。谢谢!
    【解决方案2】:

    MVC 期货支持这样的东西

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-05
      • 2016-06-28
      • 1970-01-01
      • 1970-01-01
      • 2013-10-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多