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