Rompiamo questo giù esaminando la firma del metodo:
MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
Questo sta usando metodo di estensione della sintassi, che significa che è l'aggiunta di un metodo denominato EditorFor
a HtmlHelper
tale che è possibile effettuare la chiamata Html.EditorFor
. Ma ciò che siamo davvero interessa è il secondo parametro, Expression<Func<TModel, TValue>>
. Questo è un parametro piuttosto complicato, ma per ora possiamo ignorare il fatto che si tratta di un Expression
. Quindi semplificando, esaminiamo:
Func<TModel, TValue> expression
Ciò significa che l'argomento è qualsiasi metodo che ha un parametro (di tipo TModel
) e il tipo di ritorno è TValue
. Hai usato lambda, che è (essenzialmente) una rappresentazione più concisa di un metodo, ma è utile considerarlo semplicemente come un metodo normale. Quindi sei lambda sta prendendo un modello e il ritorno di un modello:
m => m
Questo non è così interessante, quindi cerchiamo di confrontarlo con uno scenario più realistico in cui si sta tornando una proprietà fuori del modello:
m => m.MyStringProperty
Ora confrontiamo con un metodo statico ordinario hai dichiarato da qualche parte:
public static class MyStaticClass
{
public static string Foo(TModel model)
{
return model.MyStringProperty;
}
}
Anche se in realtà qui non sarebbe TModel
- sarebbe tutto ciò che dichiarato il tuo tipo di modello tramite @model
. Ora, per il bene della discussione, si potrebbe avere invece usato questo metodo nella vostra invocazione EditorFor
:
Html.EditorFor(MyStaticClass.Foo);
Quindi, per riassumere, lambda sono (per la maggior parte) solo una breve mano per un metodo regolare. Quindi tutto quello che stai facendo è passare i metodi.
L'ultima nota è che in realtà stiamo usando gli alberi di espressione, il che significa che non si sta passando il metodo, si passa un modello di oggetto (un albero di espressioni) che rappresenta il codice del metodo. Questo è, in sostanza, appena usato per capire il nome della proprietà che stai usando (perché di solito il lambda sarebbe più simile a m => m.MyProperty
, non solo a m => m
). Tutto questo per evitare stringhe magiche in cui ci si riferisce al nome della proprietà usando una stringa (ad esempio "MyProperty").
"e non vedo sovraccarico per il passaggio di un solo parametro" - 'EditorFor' è un metodo di estensione, quindi stai cercando l'unico sovraccarico con due parametri, il primo è" questo ". – hvd
Anche una cosa che consiglierei di creare un sito in mvc3 è di usare i tipi specifici di editor come '@ Html.TextBoxFor (m => m.name)' questo è così che se vuoi un valore predefinito funzionerà. Dove io (almeno) non sono stato in grado di assegnarlo a un 'EditorFor'. Anche TextBox/TextArea supporta i segnaposto tra le altre cose in cui 'EditorFor' non lo fa. così potresti fare '@ Html.TextBoxFor (m => m.Name, new {placeholder =" John Doe "})' e mvc implementerà automaticamente un segnaposto nei browser che lo supportano. – Jared