Давайте рассмотрим пример:
public class A
{
public B B { get; set; }
}
public class B
{
public C C { get; set; }
}
public class C
{
public string SomeProperty { get; set; }
}
Теперь давайте предположим, что у нас есть представление, которое строго типизировано как A
:
@model A
@Html.EditorFor(x => x.B)
Внутри этого представления мы находимся внутриконтекст A. Затем мы визуализируем шаблон редактора B:
@model B
@Html.EditorFor(x => x.C)
Теперь, даже если мы находимся внутри шаблона для B, он вспомнил, что этот шаблон был вызван в контексте A. Наконец, мы переходим кшаблон C:
@model C
@Html.TextBoxFor(x => x.SomeProperty)
Внутри шаблона C он вспомнил, что этот шаблон был вызван в контексте B, который сам был вызван в контексте A, поэтому он сгенерирует следующее имя для текстового поля:
<input type="text" name="B.C.SomeProperty" id="B_C_SomeProperty" />
Таким образом, в основном шаблоны ASP.NET MVC помнят контекст, в котором они были вызваны.
Это также работает с коллекциями.Например:
public class B
{
public IEnumerable<C> C { get; set; }
}
и затем вы делаете:
@model B
@Html.EditorFor(x => x.C)
и внутри шаблона для C:
@model C
@Html.TextBoxFor(x => x.SomeProperty)
, так как шаблон редактора C будет отображатьсядля каждого элемента коллекции будет сгенерировано:
<input type="text" name="B.C[0].SomeProperty" id="B_C0_SomeProperty" />
<input type="text" name="B.C[1].SomeProperty" id="B_C1_SomeProperty" />
<input type="text" name="B.C[2].SomeProperty" id="B_C2_SomeProperty" />
...