Частичные представления ASP.NET и скрытые переменные с MVC 3 (Razor) - PullRequest
0 голосов
/ 11 октября 2011

При создании скрытых переменных из модели используется только имя переменной.Если используется вложенный класс / структура вне модели, то используется имя класса / структуры.Это помогает при публикации формы, поскольку системе легче увидеть объект, который она заполняет.

Однако при использовании частичных представлений я часто передаю части модели, что означает, что скрытых полей нет.больше в них имя структуры / класса.Это может вызвать конфликт или потерю данных при восстановлении параметров для обратной записи.Есть ли способ получить Html.HiddenFor (или его эквивалент), чтобы поместить имя класса / структуры в начало?

1 Ответ

2 голосов
/ 11 октября 2011

Два варианта:

  1. Используйте Html.EditorFor(..) вместо прямых частичных видов. EditorFor учитывает префикс / иерархию, использованный для доступа к свойству, или

  2. манипулирует T emplateInfo.HtmlFieldPrefix перед рендерингом дочернего элемента, что приведет к автоматическому префиксу каждого поля, представленного дочерним элементом.

Если вы выберете вариант (2), подумайте о том, чтобы объявить помощника, который завершит манипуляцию HtmlFieldPrefix, чтобы вы не забыли сбросить его (я скопировал код для ChildPrefixScope ниже, где-то еще на SO, когда-то назад).

например:

static public class MyHtmlHelpers
{
    public static IDisposable BeginChildScope<TModel>(this HtmlHelper<TModel> html, string parentScopeName)
    {
        return new ChildPrefixScope(html.ViewData.TemplateInfo, parentScopeName);
    }

    private class ChildPrefixScope : IDisposable
    {
        private readonly TemplateInfo _templateInfo;
        private readonly string _previousPrefix;

        public ChildPrefixScope(TemplateInfo templateInfo, string collectionItemName)
        {
            this._templateInfo = templateInfo;

            _previousPrefix = templateInfo.HtmlFieldPrefix;
            templateInfo.HtmlFieldPrefix = collectionItemName;
        }

        public void Dispose()
        {
            _templateInfo.HtmlFieldPrefix = _previousPrefix;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...