10

如果我将 HtmlAttributes 传递给模板,如下所示:

@Html.DisplayFor(m => m.FirstName, new { htmlAttributes = new { @class = "orangetxt strongtxt" } })

在我的模板中,我将如何将这些注入到我的 HTML 中:

<span @ViewData["htmlAttributes"]>@Model</span>

这几乎可行,但它做了一些非常奇怪的事情,所以我假设这不是要走的路。

我意识到我可以使用 HtmlHelper 扩展方法来呈现完整的 HTML 元素(在本例中为跨度)并以这种方式传递属性,但是有没有办法将属性直接呈现到 HTML 元素中,就像上面一样例子?

4

4 回答 4

9

下面的扩展方法将允许我将 HtmlAttributes 转换为字符串:

    public static MvcHtmlString RenderHtmlAttributes<TModel>(
        this HtmlHelper<TModel> htmlHelper, object htmlAttributes)
    {
        var attrbituesDictionary = new RouteValueDictionary(htmlAttributes);

        return MvcHtmlString.Create(String.Join(" ", 
            attrbituesDictionary.Select(
                item => String.Format("{0}=\"{1}\"", item.Key, 
                htmlHelper.Encode(item.Value)))));
    }

然后,为了在标签中呈现它们,我可以这样做:

<span @Html.RenderHtmlAttributes(ViewData["htmlAttributes"])>@Model</span>
于 2011-10-20T14:01:46.010 回答
5

Jerad Rose 的回答很好,但我遇到了几个问题:

  • 它不会将属性名称中的下划线转换为破折号
  • 它不能优雅地处理无值属性

要解决第一个问题,请使用HtmlHelper.AnonymousObjectToHtmlAttributes.

以下是我对 Jerad 方法的修改:

public static MvcHtmlString RenderHtmlAttributes(this HtmlHelper helper, object htmlAttributes)
{
        if (htmlAttributes == null) return new MvcHtmlString(String.Empty);
        var attrbituesDictionary = HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes);
        return new MvcHtmlString(String.Join(" ", attrbituesDictionary.Select(item => string.IsNullOrEmpty((string)item.Value) ? String.Format("{0}", item.Key) : String.Format("{0}=\"{1}\"", item.Key, helper.Encode(item.Value)))));
}
于 2014-08-14T16:44:59.117 回答
1

试试这个,

@Html.DisplayFor(m => m.FirstName, 
                 new { htmlAttributes = "class = orangetxt strongtxt"})

这将呈现一个字符串,而您的版本确实做了一些奇怪的事情,{ }作为输出的一部分呈现。

于 2011-10-20T06:57:24.543 回答
0

DisplayFor()用于渲染与属性类型匹配的模板。

显示模板是/DisplayTemplates文件夹内的 .cshtml 文件,而该文件夹又位于视图文件夹内(即来自 Home、Shared 甚至特定控制器的任何文件夹)。

一个例子。

如果您在/Views/Shared中有这样的String.cshtml模板:

@model String

@if (string.IsNullOrEmpty(Model)) {
   <span>(no string)</span>
}
else {
   <span>@Model</span>
}

每次调用DisplayFor()字符串属性时:

DisplayFor(model => model.MyStringProperty);

它根据字符串的值呈现模板。您可以更具体,将/DisplayTemplates放在特定的 View 文件夹中,它们只有来自这些视图的调用受模板影响。


在您的情况下,您可以更加具体并DisplayFor()使用特定模板进行调用。

假设您有一个特定属性的模板,称为 MyPropertyTemplate.cshtml。你会这样打电话DisplayFor()

DisplayFor(model => model.MyProperty, "MyPropertyTemplate");

而他们,在该模板中,您可以拥有任何您想要的 HTML 属性。

@model MyProperty

<span class="orangetxt strongtxt">@MyProperty.ToString()</span>

PS:当它找不到模板时,我猜它只会调用model.Property.ToString()而不需要额外的 html。

仅供参考:EditorFor()例如,以类似的方式工作,但它使用/EditorTemplates文件夹。

于 2011-10-20T01:09:18.320 回答