Можно ли ссылаться на метод как свойство? Like Validate (x => x.Property) - PullRequest
0 голосов
/ 05 октября 2009

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

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

Результат «Контроллер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()); %>

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 октября 2009

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

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

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

0 голосов
/ 05 октября 2009

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

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

Предупреждение. Будучи «фьючерсными» вещами, он может измениться в будущих версиях

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