Umieść ten kod gdzieś:
using System;
using System.Linq.Expressions;
using System.Web.Mvc;
namespace MvcLibrary.Extensions
{
public static class HtmlExtensions
{
public static MvcHtmlString FieldIdFor<TModel, TValue>(this HtmlHelper<TModel> html,
Expression<Func<TModel, TValue>> expression)
{
string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
string inputFieldId = html.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName);
return MvcHtmlString.Create(inputFieldId);
}
}
}
Następnie w widoku ASPX:
<label for="<%= Html.FieldIdFor(m => m.EmailAddress) %>">E-mail address:</label>
<%= Html.TextBoxFor(m => m.EmailAddress) %>
Można również użyć w JavaScript wywołuje jako nie będziesz znać identyfikatora kontrolki z wyprzedzeniem i może go potrzebować, aby kod JavaScript działał przeciwko niemu:
<script> $.CoolJQueryFunction('<%= Html.FieldIdFor(m => m.EmailAddress) %>'); </script>
Metoda helperów LabelFor HTML, o której tu wspomniano, nie pozwala określić rzeczywistej etykiety tekstowej, której chcesz użyć, musisz udekorować swoje ViewModels atrybutami, aby ustawić tekst etykiety, a IMHO jest brzydkie. Wolę, aby te rzeczy pojawiały się w samej części widoku ASPX, a nie w niektórych modelach domen/widoków. Niektórzy jednak nie zgadzają się ze mną.
Nie pewny zasad delegowania linki do swoich blogach, ale pisał bloga na dokładnie tym temacie: http://www.dominicpettifer.co.uk/Blog/37/strongly-typed--label--elements-in-asp-net-mvc-2
Wiem, ale niektórzy ludzie nie rozumieją poprawnie (mój angielski nie jest zbyt dobry)! To wszystko, czego potrzebuję ... Wielkie dzięki! Udekoruj klasy modelu domeny za pomocą atrybutów nie jest dla mnie dobrą rzeczą, zgadzam się z tobą! –
To powinno być częścią struktury. – pbz
Nie * całkiem * działa w ramach kontroli użytkownika (tj. .ascx) –