Вслед за ответ mattytommo, это прекрасно работает, но есть только небольшая проблема при использовании сложных объектов, таких как, если вы используете этот код для свойства помещенного в EditorTemplate.
Вместо
var data = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);
string propertyName = data.PropertyName;
При использовании MVC4, вы можете изменить его на
var propertyName = helper.NameFor(expression);
или MVC3 и ниже
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);
Полный код:
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());
}
Это должно быть добавлено внутри статического класса в пространстве имен * System.Web.Mvc.Html *. – BornToCode
@BornToCode Вы знаете, я предпочитаю расширения, написанные под пространством имен типа, к которому они относятся, в противном случае другие разработчики никогда не будут использовать их, если они не знают их, поскольку им нужно знать о них и пространстве имен, которое они живите, чтобы добавить ссылку и использовать ее. – mattytommo
Вопрос, заданный для data-something = "MailID", где yours устанавливает его в "something".В этом примере нужно показать, как получить значение выражения, а не только имя свойства. – xr280xr