Откуда .NET MVC знает, как отображать атрибуты моделей с помощью лямбда-выражений? - PullRequest
1 голос
/ 30 марта 2011

У меня есть вопрос о модели счета по умолчанию, виде и контроллере, сгенерированных при создании нового проекта MVC 3 в Visual Studio 2010 (с использованием бритвы).Сгенерированный AccountController использует это для загрузки представления:

public ActionResult LogOn()
    {
        return View();
    }

И соответствующее представление (LogOn.cshtml) содержит код, подобный следующему:

@Html.LabelFor(m => m.UserName)

Мой вопрос: где эта переменная?м ”определен?Откуда он знает, что это относится к модели?Модель не передается в представление, но "m" все еще работает.Если я поменяю все ссылки на «м» на другую букву, она все равно будет работать!Может кто-нибудь объяснить, что здесь происходит?

Спасибо

Ответы [ 3 ]

5 голосов
/ 30 марта 2011

Это функция C # 3.0, которая называется «Лямбда-выражение» .

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

http://blogs.msdn.com/b/ericwhite/archive/2006/10/03/lambda-expressions.aspx

http://blah.winsmarts.com/2006/05/19/demystifying-c-30--part-4-lambda-expressions.aspx

Что касается 2-й части вашего вопроса, если вы заметили, что все методы, описанные в @Html, являются методами, связанными с моделью, это означает, что все они ожидают работы с вашей пройденной моделью.

И если вы проверите первую строку в представлении входа в систему, вы найдете эту строку:

@model YOUR_APP_NAME.Models.LogOnModel

Что определяет, что тип модели этого представления имеет тип logonModel. (Который можно найти в вашей папке Models.)

Таким образом, странный m представляет переданную модель Logon, и поэтому мы можем легко получить доступ к свойствам переданной модели, например, набрав m.UserName

1 голос
/ 30 марта 2011

'm' в этой ситуации, если имя переменной, которая предоставляется как часть лямда-выражения .

По ссылке:

ВсеВ лямбда-выражениях используется лямбда-оператор =>, который читается как «идет».Левая часть лямбда-оператора указывает входные параметры (если есть), а правая часть содержит блок выражений или операторов.Лямбда-выражение x => x * x читается как «x соответствует x раз x».

0 голосов
/ 23 ноября 2013

Лямбда-выражения - это просто сокращенные делегаты C #. Делегаты - это функции, которые могут передаваться в качестве параметров, во многом как функции JavaScript, например, обратные вызовы.

x => x.Name на самом деле является просто сокращением для создания одного из этих делегатов, который принимает некоторую переменную x в качестве параметра и возвращает эту переменную Свойство Name.

(parameters) => (expression) Это стенография для

Function(parameters) {
    return expression;
}

Итак, LabelFor принимает одну из этих сокращенных функций в качестве параметров и запускает ее в соответствии с заданным вами контекстом модели.

...