MVC4: логические атрибуты HTML5 отображаются со значением True/False

Я пытаюсь отобразить радиокнопку с некоторыми логическими атрибутами (обязательными и отключенными), используя:

@Html.RadioButton("radio-name","false", new { id="test", required=Model.BooleanValue})

а также

<input type="radio" name="radio-name" id="radio-name-no" value="false" class="radio" @if (!Model.BooleanValue) { <text>required</text> } disabled="@Model.BooleanValue" />

Но вывод такой:

<input id="test" name="radio-name" required="False" value="false" type="radio">

а также

<input name="radio-name" id="radio-name-no" value="false" class="radio" disabled="True" type="radio">

MVC4 должен отображать логические атрибуты в соответствии со спецификациями HTML5, так почему же он выводит disabled="True" (или False) вместо disabled="disabled" или disabled (или вообще ничего, если свойство BooleanValue равно false)?


person user1527576    schedule 15.11.2017    source источник
comment
Потому что вы говорите об этом, используя disabled="@Model.BooleanValue", но что вы хотите здесь делать. disabled="true" и disabled="false" (или disabled="disabled", или просто disabled) все идентичны - наличие атрибута определяет, отключен он или нет. Вам нужно условно добавить атрибут.   -  person    schedule 15.11.2017
comment
Razor2 должен, если атрибут HTML5 является логическим атрибутом, автоматически отображать его как disabled (или disabled=disabled) вместо disabled="True" и вообще не отображать его, если свойство модели имеет значение false или null. Похоже, в моем случае он выполняет ToString() и напрямую присваивает логическое значение атрибуту.   -  person user1527576    schedule 15.11.2017
comment
Не в первом случае (путем добавления htmlAttributes с использованием new { ... } (тогда условные атрибуты не применяются). И второй случай работает и будет генерировать disabled="disabled" if the property is true` и опускать его, если false - я могу только предположить, что вы не используете Razor2   -  person    schedule 15.11.2017
comment
Спасибо за разъяснение по первому случаю. Для второго я дважды проверил версию dll Razor, и это 2.0.20710.0.   -  person user1527576    schedule 15.11.2017
comment
У меня отлично работает в MVC-5 (на данный момент не могу проверить в MVC-4)   -  person    schedule 15.11.2017
comment
Вы уверены, что показали правильный код? В вашем втором примере html есть checked="True", но вы не добавили этот атрибут, поэтому он не мог быть добавлен на основе вашего кода.   -  person    schedule 15.11.2017
comment
@StephenMuecke, да, я проводил несколько тестов и удалил проверенный атрибут (обновлю вопрос, спасибо). Забавно: только что попробовал добавить логическое значение к атрибуту класса с помощью class=Model.BooleanValue и работает, как и ожидалось (скрытие атрибута class при значении false)   -  person user1527576    schedule 15.11.2017
comment
Давайте продолжим это обсуждение в чате.   -  person    schedule 15.11.2017


Ответы (1)


Решение было довольно странным. Выполняя некоторые тесты, я добавил @if в тег ввода HTML. Это if использовалось для отображения атрибута required. После этого @if я ставлю атрибут disabled="@Model.BooleanValue".

Похоже, этот приказ нарушил ожидаемое поведение. Размещение атрибута disabled перед @if решило проблему (позже я удалил @if и преобразовал его в required="@(!Model.BooleanValue)").

Теперь рабочий код:

<input type="radio" name="radio-name" id="radio-name-no" value="false" class="radio" required="@(!Model.BooleanValue)" disabled="@Model.BooleanValue" />
person user1527576    schedule 15.11.2017