Alex Rivera | Logout

EditorFor() and additionalViewData: how to add data in helper class?

Asked 2011-06-09T17:04:00.210
17

EditorFor() can take an object additionalViewData parameter which the typical method to populate is something like:

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

How can I inspect the contents of additionalViewData, add or append to existing value for a key, etc in a custom HTML Helper?

I've tried these approaches:

  • convert to Dictionary<string, object>() and add/append values: doesn't work as it looks like the implementation of EditorFor in MVC uses new RouteValueDictionary(additionalViewData) which embeds the dictionary within a dictionary
  • convert to RouteValueDictionary using new RouteValueDictionary(additionalViewData) but that has same (or very similar) issue as above

I'm also open to "you're doing it wrong" -- maybe I'm missing a simpler approach. Keep in mind what I'm trying to do is write an HTML helper that is reusable and adds some values to the additionalViewData to be used by custom views. Some of the values depend on metadata from the property so it is not quite so easy as just use a bunch of different templates.

Update with example of what I'm doing:

    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
Edit
Report

1 Answer

5

Have you tried just adding the data to

helper.ViewData[xxx] = yyy;

The ViewData collection is a global collection for the ViewContext so I think just adding it to the global ViewData will make it available when the EditorTemplate is rendered out.

MORE INFO: As I understand it, the additionalViewdata property is just an easy way to add a collection/anything to the global ViewData on the fly after you've decided which control to render. Still uses the same contextual collection and is not so much a different object as a late and clean way to add to the same context dictionary.

I haven't tried this yet, so if I'm missing the point, say so and I'll just remove the answer.

answered 2011-06-22T21:16:43.487

Your Answer