条件数据属性的奇怪行为

Kip*_*pie 2 razor asp.net-mvc-4

我在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归属.

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

在那之后,我想,"好吧,确定,这很容易修复",并修复我的代码: <input type="checkbox" @(Model.IsPrimary ? "data-primary=\"true\"" : String.Empty) checked="@(Model.Selected ? "checked" : null)" disabled="@(Model.Disabled ? "disabled" : null) />

这修复了我的data-primary属性显示,但不知何故,我的disabledchecked属性后来显示为空.

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

如果有人有任何关于为什么剃刀这样做的信息,请回复.

PS:最后,我通过将我的data-primary属性放在input元素的末尾来"修复"事物,使一切都按预期运行.

Mag*_*erg 9

从文件中的Razor 2来源HtmlMarkupParser.Block.cs:

 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);
     ...
 }
Run Code Online (Sandbox Code Playgroud)

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