Как функция mvc HtmlHelper DisplayFor извлекает полный путь свойства из лямбда-функции? - PullRequest
4 голосов
/ 03 июля 2011

Я вижу, что mvc находит имена переменных, переданных ему из лямбда-функции в методе Html.DisplayFor:

@Html.HiddenFor(model => myModel.propA.propB)

может генерировать HTML что-то вроде:

<input id="myModel_propA_propB" type="hidden" value="" >

очевидно, что использует отражение, но это вне меня.Может ли кто-нибудь заполнить меня?

ТАКЖЕ, возможно ли создать вспомогательную функцию HTML, которая принимает полностью ссылку на свойство вместо лямбда-функции для выполнения чего-то подобного?*. 1009 *

@Html.HiddenFor(myModel.propA.propB)

... и помощнику может быть передана полная ссылка "myModel.propA.propB", а не только значение propB?Является ли лямбда-функция нечетным .net обходным путем для решения такого рода задач, или это действительно предпочтительный подход во всех дисциплинах программирования.

1 Ответ

6 голосов
/ 03 июля 2011

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

MemberExpression memberExpression = (MemberExpression) expression.Body;
propertyName = memberExpression.Member.Name;

Конечно, это не завершено - например, вам придется пройтись по цепочке выражений, когда в выражении передано несколько вызовов свойств,вам придется учитывать другие типы выражений, которые передаются, кроме MemberExpression и т. д., и т. д., - но вы поняли идею.Помните, что выражение - это выражение кода, представленное в виде данных.Кроме того, поскольку MVC является открытым исходным кодом, вы можете найти точный код, который они используют, чтобы получить имя html в источниках, если хотите.

Чтобы ответить на ваш второй вопрос, ответ - нет.Передача «просто свойства» без лямбды (которая будет Expression<Func<T,object>>) не будет работать, потому что тогда функция может видеть только переданное значение - и ничего о том, как вызывающий код достиг этого значения.

...