Благодаря оригинальному автору, Энтони Джонстон!
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"
Видите, как в словаре находится содержимое словаря? Да, фактические данные находятся в этом внутреннем словаре, однако неудивительно, что это не работает.
Добавлена награда.