Nawiązując do odpowiedzi mattytommo, ten działa świetnie, ale jest tylko mały problem w przypadku korzystania z obiektów złożonych, takich jak w przypadku korzystania z tego kodu do nieruchomości znajdujących się wewnątrz EditorTemplate.
Zamiast
var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string propertyName = data.PropertyName;
przypadku korzystania MVC4, można go zmienić na
var propertyName = helper.NameFor(expression);
lub MVC3 i poniżej
var propertyName = expression.Body.ToString();
propertyName = propertyName.Substring(propertyName.IndexOf(".") + 1);
if (!string.IsNullOrEmpty(helper.ViewData.TemplateInfo.HtmlFieldPrefix))
propertyName = string.Format("{0}.{1}", helper.ViewData.TemplateInfo.HtmlFieldPrefix, propertyName);
Pełny kod:
public static MvcHtmlString MyHelperFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes = null)
{
var propertyName = expression.Body.ToString();
propertyName = propertyName.Substring(propertyName.IndexOf(".") + 1);
if (!string.IsNullOrEmpty(helper.ViewData.TemplateInfo.HtmlFieldPrefix))
propertyName = string.Format("{0}.{1}", helper.ViewData.TemplateInfo.HtmlFieldPrefix, propertyName);
TagBuilder span = new TagBuilder("span");
span.Attributes.Add("name", propertyName);
span.Attributes.Add("data-something", propertyName);
if (htmlAttributes != null)
{
var attributes = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
span.MergeAttributes(attributes);
}
return new MvcHtmlString(span.ToString());
}
To powinno być dodane wewnątrz klasy statycznej w przestrzeni nazw * System.Web.Mvc.Html *. – BornToCode
@BornToCode Wiesz, zdecydowanie preferuję rozszerzenia napisane pod nazwą obszaru, do którego się odnoszą, w przeciwnym razie inni deweloperzy nigdy z nich nie skorzystają, jeśli nie znają ich tak, jak powinni wiedzieć o nich i przestrzeni nazw, żyć w celu dodania odniesienia i użycia go. – mattytommo
Pytanie zadawane dla danych-coś = "MailID", gdzie twój ustawia go na "coś".Przykład musi pokazać, jak uzyskać wartość wyrażenia, a nie tylko nazwę właściwości. – xr280xr