2013-07-09 3 views
2

Я сталкиваюсь каким-то странное поведение в ASP.Net MVC 4.Weird поведения с условными данными-атрибуты

на основе некоторой информации от моего ViewModel, я пытаюсь установить некоторые условные атрибуты, как так: <input type="checkbox" [email protected](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 attribte.

Это приводит к моему первому вопросу: Что вызывает это странное поведение? Это потому, что я использую атрибут data? Это черта внутри атрибута данных?

После этого я подумал: «Хорошо, конечно, что может легко быть исправлено», и сосредоточил свой код следующим образом: <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: В конце концов, я «исправил» вещи, поместив свой атрибут data-primary в конец входного элемента, заставив все действовать так, как ожидалось.

ответ

9

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

Я не знаю, почему они сделали это, но похоже, что это дизайн.

Смежные вопросы