我在ASP.Net MVC 4中遇到了一些奇怪的行为。
基于我的viewmodel中的一些信息,我试图设置一些条件属性,如下所示:
<input type="checkbox" data-primary=@(Model.IsPrimary ? "true" : null) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />
这适用于checked
和disabled
属性,但由于某种原因,它始终会呈现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
属性,但不知怎的,我的disabled
和checked
属性显示为空。
我现在的第二个问题是导致这种行为的原因是什么?据我所知,我的代码中没有语法奇怪。
如果有人知道为什么剃刀会以这种方式行事,请回复。
PS:最后,我&#34;修复&#34;将data-primary
属性放在input元素的末尾,使所有内容按预期运行。
答案 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);
...
}
我不知道他们为什么会这样做,但似乎是设计的。