EditorFor() может принимать параметр object additionalViewData
, который типичный метод для заполнения - это что-то вроде:
EditorFor(model => model.PropertyName, new { myKey = "myValue" })
Как я могу проверить содержимое дополнительныхViewData, добавить или добавить существующее значение для ключа и т.д. в пользовательский HTML-помощник?
Я пробовал эти подходы:
- конвертировать в
Dictionary<string, object>()
и добавлять/добавлять значения: не работает, поскольку похоже, что реализация EditorFor в MVC использует новый RouteValueDictionary (дополнительныйViewData), который вставляет словарь в словарь - конвертировать в RouteValueDictionary с помощью
new RouteValueDictionary(additionalViewData)
, но имеет такую же (или очень похожую) проблему, как указано выше
Я также открыт для "вы делаете это неправильно" - может быть, мне не хватает более простого подхода. Имейте в виду, что я пытаюсь написать HTML-помощник, который многократно используется, и добавляет некоторые значения в дополнительныйViewData, который будет использоваться пользовательскими представлениями. Некоторые из значений зависят от метаданных от свойства, поэтому это не так просто, как просто использовать кучу разных шаблонов.
Обновите пример того, что я делаю:
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"
Посмотрите, как словарь содержит содержимое словаря внутри него? Да, фактические данные в этом внутреннем словаре, однако, неудивительно, это не работает.
Добавлена награда.