如何从代码隐藏中添加无价值的 HTML5 属性

How to add value-less HTML5 attributes from code-behind

这是这个问题的跟进:How to add <audio> tag to Content of Page in Code behind?

这里我正在创建一个这样的 audio 控件。

var myAudio = new System.Web.UI.HtmlControls.HtmlAudio();
myAudio.Attributes.Add("autoplay", "autoplay");
myAudio.Attributes.Add("controls", "controls");
myAudio.Src = "test.mp3";
Form.Controls.Add(myAudio);

这在页面中呈现为

<audio src="test.mp3" autoplay="autoplay" controls="controls"></audio>

有效。但理想情况下,我希望将其呈现为

<audio src="test.mp3" autoplay controls></audio>

也就是说,作为一个只有键 autoplaycontrols 的无值属性。

我试过了

myAudio.Attributes.Add("autoplay", ""); //autoplay = "";
myAudio.Attributes.Add("autoplay", null); //autoplay attribute missing

但是这些都没有产生令人满意的结果。

有没有办法用无值属性呈现控件?

一个可能的解决方案是重写继承控件上的 RenderAttributes 方法。

public class MyCustomAudio : System.Web.UI.HtmlControls.HtmlAudio
{
    protected override void RenderAttributes(HtmlTextWriter writer)
    {
        foreach (string key in this.Attributes.Keys)
        {
            String val = this.Attributes[key];
            writer.Write(val == key
                ? String.Format(" {0}", key)
                : String.Format(" {0}=\"{1}\"", key, val));
        }
    }
}

使用相同的代码:

var myAudio = new MyCustomAudio();
myAudio.Attributes.Add("autoplay", "autoplay");
myAudio.Attributes.Add("controls", "controls");
myAudio.Src = "test.mp3";
Form.Controls.Add(myAudio);

我得到了这个输出:

<audio autoplay controls src="test.mp3"></audio>