Примечание. Используемые ниже функции могут отсутствовать 4 года назад ...
Во-первых, вам больше не нужно использовать beestings, используется синтаксис @
в Razor примеры гораздо чище.
Метод, который вы вызываете, находится в System.Web.Mvc.Html.EditorExtensions
:
public static MvcHtmlString EditorFor<TModel, TValue>(
this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression
)
...
Ваш подход:
@foreach (var billboard in Model.Billboards ) {
@Html.EditorFor(x => billboard, "BillboardForm")
}
Тело выражения x => billboard
представляет собой ConstantExpression
.
При таком подходе соответствующая область применения применяется в шаблоне EditorTemplate:
@for (var i = 0; i < Model.BillBoards.Count(); i++)
{
@Html.EditorFor(x => Model.BillBoards[i], "BillboardForm")
}
Если Model.BillBoards
является массивом, выражение x => Model.BillBoards[i]
можно описать как
SimpleBinaryExpression{NodeType:ArrayIndex}(
Left: ConstantExpression,
Right: ConstantExpression
)
Если Model.BillBoards
является IList<T>
, выражение x => Model.BillBoards[i]
можно описать как
InstanceMethodCallExpressionN(
Method:RuntimeMethodInfo(IList<T>.get_Item (Int32 index)),
Object:PropertyExpression(ConstantExpression),
Arguments:[ConstantExpression]
)
Перегрузки EditorFor()
, которые принимают выражения, проверяют тип тела выражения и NodeType и соответственно создают область действия.
Этот код должен быть эквивалентен, если внутри цикла больше ничего нет:
@Html.EditorFor(x => Model.BillBoards, "BillboardForm")
Если у вас есть только вид только для чтения и вид редактирования, вы можете переименовать ваши шаблоны и удалить второй параметр. Предполагая, что BillBoard
является вашим классом Model, переименуйте BillboardForm.cshtml
в EditorTemplates/BillBoard.cshtml
, затем измените код на
@Html.EditorFor(x => Model.BillBoards)