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