Потому что мне нужно построить очень строго типизированный и сохраненный тип проекта для 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()); %>
Спасибо