c# - RouteValueDictionary 到 HtmlAttributes

标签 c# razor tagbuilder

我知道我可以通过执行以下操作将 html 属性添加到我的标签中:

var htmlAttributes = new RouteValueDictionary { { "data-foo", "bar" } };
var tag = new TagBuilder("div");
tag.MergeAttributes(htmlAttributes );
@tag

输出:

<div data-foo="bar"></div>

我想知道我是否可以通过使用标记而不是标签生成器以类似的方式添加属性。也许是这样的:

var htmlAttributes = new RouteValueDictionary { { "data-foo", "bar" } };
<div @htmlAttributes.ToHtmlAttributes() ></div>

预期输出:

<div data-foo="bar"></div>

显然,我无法以这种方式处理合并冲突。但是,我认为这是值得的,因为第二种方式可读性更高。

最佳答案

您可以编写自己的扩展方法:

namespace SomeNamespace
{
    public static class RouteValueDictionaryExtensions
    {
        public static IHtmlString ToHtmlAttributes(this RouteValueDictionary dictionary)
        {
            var sb = new StringBuilder();
            foreach (var kvp in dictionary)
            {
                sb.Append(string.Format("{0}=\"{1}\" ", kvp.Key, kvp.Value));
            }
            return new HtmlString(sb.ToString());
        }
    }
}

这将完全按照您的描述使用:

@using SomeNamespace    
@{
    var htmlAttributes = new RouteValueDictionary
        {
            {"data-foo", "bar"},
            {"data-bar", "foo"}
        };
}

<div @htmlAttributes.ToHtmlAttributes()> </div>

结果是:

<div data-foo="bar" data-bar="foo" > </div>

编辑:

如果你想使用 TagBuilder,你也可以编写另一个在内部使用它的扩展:

public static IHtmlString Tag(this HtmlHelper helper, 
                              RouteValueDictionary dictionary, 
                              string tagName)
{
    var tag = new TagBuilder(tagName);
    tag.MergeAttributes(dictionary);
    return new HtmlString(tag.ToString());
}

下面显示的用法给出了与之前相同的输出 html:

@Html.Tag(htmlAttributes, "div")

关于c# - RouteValueDictionary 到 HtmlAttributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18618299/

相关文章:

c# - 具有代码优先迁移的 Entity Framework 多个项目

c# - 使用 Razor 条件语句防止换行

html - 在 MVC 中使用 Metro CSS 3 表单验证

javascript - 基于ViewBag显示Modal Error Message的PartialView

javascript - 如何加载局部 View 并将其存储在要在 javascript 中使用的变量中?

c# - .NET 中的互操作性受损?

c# - 检查数字中的数字是否按升序排列

c# - 从基类反射(reflect)私有(private)字段

c# - 网络核心 : Use a Tag Helper in a Custom Tag Helper that returns Html?

asp.net - TagBuilder 中的内部 ToMVCHmlString