Можно ли ссылаться на метод как на свойство? Как Validate(x => x.Property)

Потому что мне нужно создать очень строго типизированный и безопасный проект для Asp.net MVC. Но я обнаружил, что большая часть синтаксиса на странице просмотра не является переменной с безопасным типом. Пожалуйста, посмотрите на следующий пример.

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

Результат "Контроллер1: Действие1"!

Обновление 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()); %>

Спасибо,


person Soul_Master    schedule 05.10.2009    source источник


Ответы (2)


Хотя лямбда-выражения теперь возможны, в этом случае они вам не помогут. Давайте просто посмотрим на ваш пример: метод BeginForm принимает две строки в качестве входных данных, и никакие лямбда-выражения не изменят этого.

Вы можете инкапсулировать эти строки как свойства одного или нескольких классов, но по этой причине это не станет более типобезопасным.

Может немного помочь перемещение всех строк в центральное место, чтобы уменьшить риск неправильного написания имен, но они все равно будут строками.

person Mark Seemann    schedule 05.10.2009
comment
Как вы говорите, я просто пытаюсь. Возможно, поэтому я создам вспомогательный класс для решения этой проблемы. Спасибо! - person Soul_Master; 05.10.2009

MVC Futures поддерживает что-то вроде этого

Его можно загрузить с сайта asp.net/mvc или codeplex и получить исходный код в качестве "руководства"

Предупреждение: поскольку речь идет о будущем, это может измениться в будущих выпусках.

person TFD    schedule 05.10.2009