Благодаря оригинальному автору, Энтони Джонстон!

rFor () может взятьobject additionalViewData Параметр, который типичный метод для заполнения это что-то вроде:

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

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

Я попробовал эти подходы:

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

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

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

    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<string, object>() и передать этот словарьEditorFor():

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

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

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

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

Ответы на вопрос(5)

Ваш ответ на вопрос