Reputation: 5670
I've created custom Editor templates and Display templates. I've placed each of these types in a folder within my views folder. The folders were named either EditorTemplate or DisplayTemplate, depending upon which type of template was created.
So, now I can use EditorFor to use my custom editor template, or DisplayFor for my custom editor template.
I would like to create a custom template for a LabelFor, but I haven't found an example of this. Would I create a folder named Labeltemplate in my Views folder and add it here?
UPDATE
The reason I was trying to extend the LabelFor was to handle a Property that is of type KeyValuePair. I want to use the Key of this property as the Label, and the value as the Display. I asked a question here about the DisplayFor to handle the Value.
My solution ended up as>
@Html.DisplayFor(m => m.MyProperty, @Model.MyProperty.Key)
Thanks,
Upvotes: 7
Views: 3478
Reputation: 1038710
LabelFor
doesn't use any templates. It is hardcoded in the MVC source code and it spits a <label>
no matter what you do.
You will have to write a custom html helper if you want to modify this behavior.
On the other hand if you want to use templates you have to use EditorFor/DisplayFor helpers. So, since a label is for displaying purposes you could use a display template and instead of using Html.LabelFor(x => x.Foo)
use Html.DisplayFor(x => x.Foo)
. As far as the custom template is concerned, either you decorate the Foo
property with the [UIHint]
attribute or pass it as second argument to the DisplayFor
helper.
UPDATE:
According to your comment you are not trying to modify the markup but only the value. That's what the second argument of the LabelFor helper could be used for:
@Html.LabelFor(x => x.Foo, Model.Key)
@Html.EditorFor(x => x.Foo)
This creates a label which is associated with the Foo input (for
attribute of the label properly assigned) but the text shown is that of the Key
property on your view model.
Upvotes: 6
Reputation: 7584
You can create a DisplayTemplate and access it via template name:
@Html.DisplayFor(x => x.Foo, "label")
And then just create a template called label.cshtml in your DisplayTemplates folder.
To simplify this call, you can write an extension method that handles this call:
public static MvcHtmlString TemplateLabelFor<TModel, TProperty>(this HtmlHelper<TModel> html, Expression<Func<TModel, TProperty>> property)
{
return html.DisplayFor(property, "label");
}
Upvotes: 1
Reputation: 4841
There is no support for creating a template for a specific HTML Helper method (LabelFor).
You could:
Markup your model using meta descriptors to change what value gets displayed as part of the label:
[DisplayName("Custom Label")]
public string Test {get;set;}
You could create your own custom HTML Helper method for rending out a label:
How can I override the @Html.LabelFor template?
Upvotes: 2