Как получить значения из объекта HtmlAttributes - PullRequest
23 голосов
/ 22 августа 2009

В asp.net mvc я всегда вижу встроенные помощники html, у них всегда есть объект htmlAttirbutes.

Тогда я обычно делаю новый {@id = "test", @ class = "myClass"}.

Как извлечь параметр, подобный этому, в моих собственных помощниках HTML?

Как будто я использую «HtmlTextWriterTag», это способ, которым я могу передать весь этот объект автору, и он понял это или как?

Кроме того, как это работает с большими помощниками HTML?

Как будто я делаю html-помощник, и он использует все эти теги.

Table
thead
tfooter
tbody
tr
td
a
img

Значит ли это, что я должен сделать атрибут HTML для каждого из этих тегов?

Ответы [ 3 ]

36 голосов
/ 22 августа 2009

Я обычно делаю что-то вроде этого:

   public static string Label(this HtmlHelper htmlHelper, string forName, string labelText, object htmlAttributes)
    {
        return Label(htmlHelper, forName, labelText, new RouteValueDictionary(htmlAttributes));
    }

    public static string Label(this HtmlHelper htmlHelper, string forName, string labelText,
                               IDictionary<string, object> htmlAttributes)
    {
        // Get the id
        if (htmlAttributes.ContainsKey("Id"))
        {
            string id = htmlAttributes["Id"] as string;
        }

        TagBuilder tagBuilder = new TagBuilder("label");
        tagBuilder.MergeAttributes(htmlAttributes);
        tagBuilder.MergeAttribute("for", forName, true);
        tagBuilder.SetInnerText(labelText);
        return tagBuilder.ToString();
    }

Я предлагаю вам скачать исходный код ASP.NET MVC из кодекса и взглянуть на встроенные помощники html.

4 голосов
/ 11 июля 2013

вы можете преобразовать объект htmlAttirbutes в строковое представление атрибут / значение, например:

var htmlAttributes = new { id="myid", @class="myclass" };

string string_htmlAttributes = "";
foreach (PropertyDescriptor property in TypeDescriptor.GetProperties(htmlAttributes))
{
  string_htmlAttributes += string.Format("{0}=\"{1}\" ", property.Name.Replace('_', '-'), HttpUtility.HtmlAttributeEncode(property.GetValue(htmlAttributes).ToString()));
}

PropertyDescriptor относятся к классу System.ComponentModel

1 голос
/ 02 мая 2014

Я использую сочетание обоих методов (Chtiwi Malek и rrejc), предложенных ранее, и это прекрасно работает.

С помощью этого метода он преобразует data_id в data-id. Он также перезапишет значения атрибутов по умолчанию, которые вы установили ранее.

using System.ComponentModel;
...


public static MvcHtmlString RequiredLabelFor<TModel, TValue>(this HtmlHelper<TModel> helper, Expression<Func<TModel, TValue>> expression, object htmlAttributes)
{
    var metaData = ModelMetadata.FromLambdaExpression(expression, helper.ViewData);

    string htmlFieldName = ExpressionHelper.GetExpressionText(expression);
    string labelText = metaData.DisplayName ?? metaData.PropertyName ?? htmlFieldName.Split('.').Last();

    if (String.IsNullOrEmpty(labelText))
        return MvcHtmlString.Empty;

    var label = new TagBuilder("label");
    label.Attributes.Add("for", helper.ViewContext.ViewData.TemplateInfo.GetFullHtmlFieldId(htmlFieldName));

    foreach (PropertyDescriptor prop in TypeDescriptor.GetProperties(htmlAttributes))
    {
        // By adding the 'true' as the third parameter, you can overwrite whatever default attribute you have set earlier.
        label.MergeAttribute(prop.Name.Replace('_', '-'), prop.GetValue(htmlAttributes).ToString(), true);
    }
    label.InnerHtml = labelText;
    return MvcHtmlString.Create(label.ToString());
}

Обратите внимание на комментарий о перезаписи атрибута со значением по умолчанию в вашем коде в foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...