条件数据属性的奇怪行为

时间:2013-07-09 09:43:46

标签: asp.net-mvc-4 razor

我在ASP.Net MVC 4中遇到了一些奇怪的行为。

基于我的viewmodel中的一些信息,我试图设置一些条件属性,如下所示: <input type="checkbox" data-primary=@(Model.IsPrimary ? "true" : null) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />

这适用于checkeddisabled属性,但由于某种原因,它始终会呈现data-primary属性。 Model.IsPrimary会导致正确的data-primary="true",但!Model.IsPrimary会导致空data-primary归属。

这引出了我的第一个问题: 导致这种奇怪行为的原因是什么?是因为我使用的是数据属性吗?它是数据属性中的破折号吗?

在那之后,我想,&#34;好吧,当然,可以轻松修复&#34;,并修复我的代码: <input type="checkbox" @(Model.IsPrimary ? "data-primary=\"true\"" : String.Empty) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />

这修复了我的data-primary属性,但不知怎的,我的disabledchecked属性显示为空。

我现在的第二个问题是导致这种行为的原因是什么?据我所知,我的代码中没有语法奇怪。

如果有人知道为什么剃刀会以这种方式行事,请回复。

PS:最后,我&#34;修复&#34;将data-primary属性放在input元素的末尾,使所有内容按预期运行。

1 个答案:

答案 0 :(得分:9)

来自HtmlMarkupParser.Block.cs文件中的source of Razor 2

 private void AttributePrefix(IEnumerable<HtmlSymbol> whitespace, IEnumerable<HtmlSymbol> nameSymbols)
 {
     // First, determine if this is a 'data-' attribute (since those can't use conditional attributes)
     LocationTagged<string> name = nameSymbols.GetContent(Span.Start);
     bool attributeCanBeConditional = !name.Value.StartsWith("data-", StringComparison.OrdinalIgnoreCase);
     ...
 }

我不知道他们为什么会这样做,但似乎是设计的。