Вопрос по c#, editorfor, extension-methods, razor, lambda – @ Html.EditorFor (m => m) лямбда-синтаксис в MVC

13

Я только изучаю C # и MVC и пытаюсь понять некоторые примеры.

<code>@Html.EditorFor(m => m)
</code>

В конце концов я понял, что & quot; & gt; & ap; является лямбда-оператором, и он означает что-то вроде & quot; m, такое что m & quot ;. Это не имеет никакого смысла для меня. Почему бы просто не пройти в м?

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

Наконец, я посмотрел на определение Html.EditorFor и не вижу никакой перегрузки для передачи только одного параметра. Где этот синтаксис определен ?? http://msdn.microsoft.com/en-us/library/ee834942.aspx

"и не вижу никакой перегрузки для передачи только одного параметра" -EditorFor является методом расширения, поэтому вы ищете одну перегрузку с двумя параметрами, первый из которых «this». user743382
Также одна вещь, которую я рекомендую при создании сайта в mvc3, - это использование определенных типов редакторов, таких как@Html.TextBoxFor(m => m.name) это так, что если вам когда-либо понадобится значение по умолчанию, оно будет работать. Где я (по крайней мере) не смог назначить этоEditorFor, Также TextBox / TextArea и т. Д. Поддерживают заполнители среди прочего, гдеEditorFor не. чтобы ты мог сделать@Html.TextBoxFor(m=>m.Name, new { placeholder = "John Doe" }) и mvc автоматически реализует заполнитель в браузерах, которые его поддерживают. Jared

Ваш Ответ

4   ответа
2

1.

@Html.EditorFor(m => m) - display editor for whole model @Html.EditorFor(m => m.propertyName) - display editor for specific property of model

2.

@Html.EditorFor(m => m) равно@Html.EditorFor(t => t) или же@Html.EditorFor(randomName => randomName), Имя не имеет значения, это просто имя параметра. Тип этого параметра - тип модели представления.

Вы должны передать функцию, потому что учитывается не только значение. Отражения используются для получения атрибутов, которые описывают, как отобразить свойство. Посмотрите на этот пример

public class ResetPasswordModel
{
    public string Username { get; set; }

    [DataType(DataType.Password)]
    public string NewPassword { get; set; }
    [DataType(DataType.Password)]
    public string PasswordConfirmed { get; set; }
}

Атрибуты описывают, что NewPassword должен быть полем пароля, а не обычным вводом. Если бы мы передали значение, это было бы невозможно.

В нашем примере@Html.EditorFor(m => m) покажет наличие одного ввода для имени пользователя и два ввода пароля для паролей.@Html.EditorFor(m => m.NewPassword) покажет ввод, который имеет тип пароля.

3.

http://msdn.microsoft.com/en-us/library/ee402949.aspx

public static MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html,
    Expression<Func<TModel, TValue>> expression
)

Это метод расширения для класса HtmlHelper.this HtmlHelper<TModel> html это не параметр, это тип класса, функция расширяется.

1

=> оператор как значение "переходит к", так(m => m) означает "m переходит к m", иначе говоря, вы получаете то же самоеm.

В вашем примере@Html.EditorFor(m => m), m является анонимным входным параметром для лямбда-выраженияm => m, который является аргументом метода расширенияEditorFor, Как вы отметили в своем вопросе, ни одна из перегрузок для этого метода не принимает меньше одного параметра; это потому что этоМетод расширения и первый параметр указывает тип, который он расширяет. Второй параметр являетсявыражениеи вы можете использовать лямбдуexpressions для этих.

3

t serve any purpose, true. But its real use is for when you want to render the editor for a property of the model: @Html.EditorFor(m => m.SomeProperty). Lambda expressions are really just shorthand for functions, but strongly typed by way of delegates. The concept might be more familiar from Javascript:

myFunction( function(x) { return x.SomeProperty; });

The "m" isn't predefined. It's naming the parameter for the second part of the lambda expression, and could be anything: @Html.EditorFor( whatever => whatever ). (It refers to the same thing, in this case the page's model, regardless of what you name it.)

The first parameter you see in those definitions for Html.EditorFor isn't really a parameter. You'll notice they're using the this keyword to define extension methods. That parameter refers the the object that invoked the method, in this case the HtmlHelper<Model> object.

3. Очень полезно, я не заметил / не понял, что он проходил "это" в качестве первого параметра. 2. Я все еще немного озадачен этой лямбда-функцией, поскольку в сочетании с ответом Кирка Уолла она должна возвращать тип модели John Zumbrum
18

MvcHtmlString EditorFor<TModel, TValue>(
    this HtmlHelper<TModel> html, 
    Expression<Func<TModel, TValue>> expression
)

Это использует синтаксис метода расширения, что означает, что он добавляет метод с именемEditorFor вHtmlHelper такой, что вы можете сделать звонокHtml.EditorFor, Но что нас действительно интересует, так это второй параметр,Expression<Func<TModel, TValue>>, Это довольно сложный параметр, но сейчас мы можем игнорировать тот факт, что онExpression, Итак, упрощая, давайте рассмотрим:

Func<TModel, TValue> expression

Это означает, что аргументany метод с одним параметром (типаTModel) и тип возвращаемого значенияTValue, Вы использовали лямбду, которая (по существу) является более кратким представлением метода, но полезно просто думать о нем как об обычном методе. Итак, лямбда берет модель и возвращает модель:

m => m

Это не так интересно, поэтому давайте сравним его с более реалистичным сценарием, в котором вы возвращаете свойство из модели:

m => m.MyStringProperty

Теперь давайте сравним его с обычным статическим методом, который вы где-то объявили:

public static class MyStaticClass 
{
    public static string Foo(TModel model) 
    {
        return model.MyStringProperty;
    }
}

Хотя на самом деле здесь не было быTModel - это было бы то, что вы объявили свой тип модели через@model, Теперь, для обсуждения, вы могли бы вместо этого использовать этот метод при вызовеEditorFor:

Html.EditorFor(MyStaticClass.Foo);

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

Последнее замечание: мы фактически используем деревья выражений, что означает, что вы фактически не передаете метод, вы передаете объектную модель (дерево выражений), которая представляет код метода. По сути, это просто используется для определения имени свойства, которое вы используете (потому что обычно лямбда будет больше похожа наm => m.MyPropertyне простоm => m). Это все, чтобы избежать магических строк, когда вы ссылаетесь на имя свойства, используя строку (т.е. "MyProperty").

вау, классный ответ! Часть, которую я пропустил, состоит в том, что вы должны использовать выражение, которое является именем метода, которое возвращает модель. Ваш пример с MyStaticClass был самым полезным в понимании этой концепции. John Zumbrum

Похожие вопросы