Что такое «шаблонный контекст» в ASP.NET MVC и влияет ли он на генерацию идентификаторов на стороне клиента? - PullRequest
0 голосов
/ 30 ноября 2011

Я читал пост Стивена Сандерсона , где он упомянул эту концепцию и умело ее использует. Тем не менее, концепция остается неопределенной для меня. Напоминает мне о INamingContainer из веб-форм. Официальная документация также мало говорит об этом (основываясь на том, что мне удалось тралить). Кроме того, каковы общие ловушки и практические правила, когда дело доходит до конечных идентификаторов на стороне клиента в MVC?

1 Ответ

3 голосов
/ 30 ноября 2011

Давайте рассмотрим пример:

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" />
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...