2

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

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

checked这对and属性很好用disabled,但由于某种原因,它总是会渲染data-primary属性。Model.IsPrimary会导致正确的data-primary="true",但会导致!Model.IsPrimarydata-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属性放在输入元素的末尾来“修复”事情,使一切都按预期进行。

4

1 回答 1

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);
     ...
 }

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

于 2013-07-23T09:22:00.203 回答