如何从对象HtmlAttributes中获取值

时间:2009-08-22 06:50:36

标签: asp.net-mvc

在asp.net mvc中我总是看到内置的html帮助器,它们总是有对象htmlAttirbutes。

然后我通常做新的{@id =“test”,@ class =“myClass”}。

如何在我自己的html助手中提取这样的参数?

就像我使用“HtmlTextWriterTag”一样,我可以将整个对象传递给作者,并且它可以解决它或者是什么?

此外,如何使用大型HTML帮助程序?

就像我正在制作一个html助手一样,它使用了所有这些标签。

Table
thead
tfooter
tbody
tr
td
a
img

这是否意味着我必须为每个标签制作一个html属性?

3 个答案:

答案 0 :(得分:36)

我通常做这样的事情:

   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();
    }

我建议您从codeplex下载ASP.NET MVC源代码并查看内置的html帮助程序。

答案 1 :(得分:4)

您可以将对象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

答案 2 :(得分:1)

我使用前面提出的两种方法(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中代码中具有默认值的属性的注释。