Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Rendering the field name in an EditorTemplate (rendered through EditorFor())

Tags:

I'm currently building the Admin back-end for a website in ASP.NET MVC.

In an ASP.NET MVC application, I've started using the 'EditorFor' helper method like so:

<div id="content-edit" class="data-form">     <p>         <%= Html.LabelFor(c => c.Title) %>         <%= Html.TextBoxFor(c => c.Title)%>     </p>     <p>         <%= Html.LabelFor(c => c.Biography) %>         <%= Html.EditorFor(c => c. Biography)%>     </p> </div> 

In the model, the 'Biography' field has been decorated with: [UIHelper("Html")].

I have an 'Html' partial view (under Views/Shared/EditorTemplates):

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %>  <textarea class="html">     <%= Model.ToString() %> </textarea> 

Now I'd like to have the 'ID' attribute of the 'textarea' set to the name of the field, like this:

<textarea id="Biography" class="html">     ... </textarea> 

But I can't see a way to do that with the current set up.

All I can think of is creating an 'Html' ViewModel that contains a 'Value' property and a 'ControlID' property.

But if I based the view off that, rather than 'System.XML.Linq.XElement', it would no longer be compatible with the 'EditorFor' helper method and I'd have to do everything manually.

Has anyone had a similar problem yet?

like image 630
Jonathan Avatar asked Sep 27 '09 06:09

Jonathan


2 Answers

You should be able to pull out the desired ID from the ViewData.TemplateInfo.HtmlFieldPrefix property of the view. Like this:

<%@ Control Language="C#"       Inherits="System.Web.Mvc.ViewUserControl<System.XML.Linq.XElement>" %> <textarea id="<%= ViewData.TemplateInfo.HtmlFieldPrefix %>" class="html">     <%= Model.ToString() %> </textarea> 

To show why this works, here's the place in TemplateHelpers.cs (of MVC2 Preview 1 source) where ViewData is initialized for the Editor template control:

ViewDataDictionary viewData = new ViewDataDictionary(html.ViewDataContainer.ViewData) {     Model = modelValue,     TemplateInfo = new TemplateInfo {         FormattedModelValue = formattedModelValue,         ModelType = modelType,         HtmlFieldPrefix = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(expression),         IsNullableValueType = (underlyingNullableType != null),     } }; 

In the call above, "expression" is initialized (further up the call stack) with the name of the property being edited.

BTW, @Sperling below caught a detail I originally missed: if you're using (or might use) a non-default HtmlHelper.IdAttributeDotReplacement, then you'll want to replace the dots in the HtmlPrefix property with HtmlHelper.IdAttributeDotReplacement.

like image 95
Justin Grant Avatar answered Apr 05 '23 10:04

Justin Grant


Have been using this to generate id(with model prefix). Skip the .Replace() part if you want the name attribute.

<%=Html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(String.Empty).Replace(".", HtmlHelper.IdAttributeDotReplacement) %> 
like image 29
Sperling Avatar answered Apr 05 '23 11:04

Sperling