Как сделать так, чтобы вводящий в заблуждение атрибут [ReadOnly] генерировал поле только для чтения

В течение очень долгого времени я думал, что применение атрибута ReadOnly к свойству модели представления означает, что сгенерированный элемент будет иметь HTML-атрибут readonly.

Затем я был очень разочарован, обнаружив, что этот атрибут ReadOnly применяется только к привязке модели, и что значение во входных данных только для чтения не привязано к опубликованной модели представления, и люди все еще могут вводить в поле пользовательского интерфейса, позволяя им думать, значение будет сохранено.

Теперь мне нужно просмотреть мою модель представления и везде, где есть этот атрибут, закомментировать его и вручную применить атрибуты HTML readonly к затронутым элементам Razor.

Теперь я хотел бы создать атрибут ReallyReadOnly, чтобы для свойств модели представления, помеченных как таковые, генерировался подлинный ввод только для чтения, а его значение было привязано к опубликованной модели представления.

Где я могу, если могу, в процессе рендеринга проверить этот новый атрибут и воздействовать на него?


person ProfK    schedule 26.05.2016    source источник
comment
Непростая задача. Вам нужно будет создать свой собственный метод расширения HtmlHelper, который считывает метаданные свойства (значение .IsReadOnly) и добавляет атрибут readonly="readonly" в HTML-код, который он выводит.   -  person    schedule 26.05.2016
comment
Это не заблуждение. Существуют буквально сотни атрибутов, большинство из которых не относятся к моделям и просто игнорируются. Вы несете ответственность за понимание того, какие атрибуты применимы, а какие нет. Атрибуты могут использоваться для многих целей, поэтому система никак не может предупредить вас об этом.   -  person Erik Funkenbusch    schedule 26.05.2016
comment
@StephenMuecke Это то, что я имею в виду. Новое вспомогательное расширение, называемое, например. ReadOnlyInput, который считывает метаданные модели и проверяет этот новый атрибут. Поскольку других вариантов, похоже, очень мало, почему бы не сделать свой комментарий ответом?   -  person ProfK    schedule 26.05.2016
comment
@ProfK, не то же самое, но этот ответ дает пример создания помощника, который добавляет атрибуты (и вы можете создавать перегрузки, которые добавляют readonly, если htmlAttributes предоставляются). В этом случае он основан на предоставлении параметра bool, но его можно удалить, и метод может быть просто @Html.ReadOnlyTextBoxFor(m => m.YourProperty). Но поскольку метод расширения специфичен, в использовании этого атрибута нет реальной необходимости.   -  person    schedule 27.05.2016
comment
Альтернативой может быть создание метода @Html.MyTextBoxFor(), который считывает свойство ModelMetadata.IsReadonly и добавляет атрибут по мере необходимости, но это будет означать замену всех ваших текущих методов @Html.TextBoxFor() в ваших представлениях.   -  person    schedule 27.05.2016


Ответы (1)


К сожалению, самым простым известным мне решением для этого является использование шаблона редактора только для чтения, который вы применяете к своей модели, аналогично описанию даты указаны здесь.

У вас будет дублирование, если вы также хотите применить ReadOnly для привязки модели, но, по крайней мере, в том же месте.

person xianwill    schedule 26.05.2016