Первый аргумент для метода расширения текстового поля устанавливает имя входного элемента, который в конечном итоге создается, а также пытается получить запись из ViewData / Model (для модели, в которой он использует TypeDescriptors / reflection) на основе этого аргумента.
Способ, которым это происходит, заключается в разделении входной строки по точкам, затем проверке ViewDataDictionary на наличие определенных ключей и модели с помощью отражения, поэтому в случае, если вы дадите это, он будет пытаться искать Контакты [0], а не Контакты и не заберу вашу собственность.
Чтобы обойти это, вам нужно просто указать фактическое значение объекта, например,
Html.TextBox("Comments.Contacts[0].ContactName",
Model.Comments.Contacts[0].ContactName)
Вы можете увидеть это сами, если посмотрите на источник MVC и взгляните на класс ViewDataDictionary.