EditorFor () и additionalViewData: как добавить данные в вспомогательный класс?

EditorFor () может принимать объект additionalViewData , типичный метод заполнения которого выглядит примерно так:

EditorFor (model => model.PropertyName, new {myKey = "myValue"})

Как я могу проверить содержимое дополнительныхViewData, добавить или добавить к существующим значение для ключа и т. д. в пользовательском помощнике HTML?

Я пробовал следующие подходы:

  • преобразовать в Dictionary () и добавить / добавить значения: не работает так, как будто реализация EditorFor в MVC использует новый RouteValueDictionary (additionalViewData)который встраивает словарь в словарь
  • преобразовать в RouteValueDictionary с использованием new RouteValueDictionary (additionalViewData) , но с такой же (или очень похожей) проблемой, как указано выше

Я также открыт для «вы делаю это неправильно »- может быть, мне не хватает более простого подхода. Имейте в виду, что я пытаюсь написать помощник HTML, который можно использовать повторно и который добавляет некоторые значения в additionalViewData, которые будут использоваться настраиваемыми представлениями. Некоторые значения зависят от метаданных из свойства, поэтому это не так просто, как просто использовать кучу разных шаблонов.

Обновите пример того, что я делаю:

    public static MvcHtmlString myNullableBooleanFor<TModel, TValue>(this HtmlHelper<TModel> htmlHelper, Expression<Func<TModel, TValue>> choice, string templateName, object additionalViewData)
    {            
        ModelMetadata metadata = ModelMetadata.FromLambdaExpression(choice, htmlHelper.ViewData);

        /*
    here need to add to additionalViewData some key values among them:
    { propertyName, metadata.PropertyName }

     */

        StringBuilder sb = new StringBuilder();
        sb.AppendLine(htmlHelper.EditorFor(choice, templateName, additionalViewData).ToString());
        MvcHtmlString validation = htmlHelper.ValidationMessageFor(choice);
        if (validation != null)
            sb.AppendLine(validation.ToString());
        return new MvcHtmlString(sb.ToString());
    }

Обновите, что происходит, когда я конвертирую анонимный объект в Dictionary () и передайте этот словарь в EditorFor () :

Я поставил точку останова в представлении Razor и изучил ViewData. Похоже, что словарь, переданный в EditorFor () , помещается в другой Dictionary () . В «Непосредственном окне» ViewData выглядит так:

ViewData.Keys
Count = 4
    [0]: "Comparer"
    [1]: "Count"
    [2]: "Keys"
    [3]: "Values"

Видите, как в словаре содержится содержимое словаря? Да, фактические данные находятся во внутреннем словаре, однако неудивительно, что это не работает.

Добавлена ​​награда.

17
задан Cymen 16 June 2011 в 00:08
поделиться