Сделайте все поля формы доступными только для чтения в MVC - PullRequest
5 голосов
/ 01 сентября 2009

Я показываю 3 или более версий формы. Одна версия представляет собой форму для редактирования всех полей. Второй версией будет версия только для чтения той же формы, которая будет использоваться для отображения всех одинаковых полей, но со всеми полями, имеющими readonly = "true" на стороне клиента, чтобы пользователь не мог вводить данные. Поля только для чтения должны использовать другой стиль CSS. Это для отображения архивных данных. Я уже скрываю кнопку отправки, чтобы они не могли отправить, но я хочу, чтобы форма выглядела так, как будто она только для чтения. В третьей версии некоторые поля будут доступны только для чтения, а некоторые - для редактирования для определенного класса пользователей с ограниченными правами на редактирование.

Я использую ASP.NET MVC 1.0. Как изменить все (или подмножество) отображаемых полей, чтобы они были доступны только для чтения. Я хотел бы перебрать коллекцию полей в контроллере и установить их все только для чтения, а также установить правильный класс CSS. Я не хочу помещать оператор if в каждое поле в файле .aspx (есть 40-50 полей), и я бы предпочел, чтобы это не было на стороне клиента, поэтому я могу запретить пользователям изменять javascript / html редактировать вещи, которые они не должны.

ТИА,

Стив Шир

Ответы [ 4 ]

14 голосов
/ 01 сентября 2009

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

Конечно, самый простой способ - на стороне клиента с помощью jQuery:

$(function() {
  $('input, select, textarea').attr('disabled', 'disabled');
});

Или, вы могли бы сделать это в своем View, но это ужасно. Вдобавок ко мне, вам понадобится что-то вроде bool, переданное в View (через ViewData, я полагаю), и проверьте это на каждый Input, чтобы увидеть, следует ли вам добавить disabled атрибут. Не мое представление о веселье ...

1 голос
/ 01 сентября 2009

У меня будут разные представления, которые соответствуют вашим состояниям, а затем я выберу представление в зависимости от того, в каком состоянии вы находитесь. Вы также можете реализовать его с частями, разбивая фрагменты, чтобы вы могли легко включать редактируемые или версии только для чтения из различных наборов элементов. Таким образом, представление только для чтения не обязательно должно даже включать элемент формы. Вы также можете представлять данные в виде span, div или абзацев, а не как элементы ввода.

Примечание: вам все равно придется проверить, есть ли у текущего пользователя возможность обновлять / создавать данные в действиях, которые отправляет форма процесса. Только потому, что вы ограничиваете возможность просмотра данных в формате только для чтения, это не остановит кого-либо от создания публикации формы, чтобы имитировать ваше приложение, если они этого захотят. Вы не можете полагаться на скрытие / отключение чего-либо на клиенте, чтобы предотвратить попытки злоумышленника ввести / изменить данные.

0 голосов
/ 02 сентября 2009

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

Спасибо за все ваши идеи и помощь.

Steve

0 голосов
/ 01 сентября 2009

Обычно я использую частичные представления для представления форм и / или частей форм.

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

  1. <% Html.RenderPartial(the_right_partial, model); %>, где the_right_partial - это значение, переданное из контроллера или помощника (в этом случае the_right_partial(something));
  2. передает параметр bool или enum из контроллера, представляющего возможность редактирования, а затем использует помощник для получения правильных атрибутов htmlAttributes, например: <%= Html.TextBox("name", value, Html.TheRightHtmlAttributesFor(isReadableOrNot)) %>;

Могут быть и другие способы, такие как создание новых помощников для полей ввода, которые принимают дополнительный аргумент isReadableOrNot (но мне это кажется излишним), или как манипулирование html / aspx каким-то странным (и полностью нечитаемым / не поддерживаемым способом) , но я бы их не советовал.

Обратите внимание, что использование html-атрибутов, таких как disabled , на стороне клиента, а с такими инструментами, как firebug, их изменение занимает всего две секунды.

Другие уже говорили это, но я также должен: всегда предполагать, что пользователь приложит все усилия, чтобы сделать наихудшую возможную вещь, поэтому проверьте права пользователя на изменение содержимого на стороне сервера и рассмотрите возможность на стороне клиента. проверяет вежливость по отношению к пользователю (чтобы он / она понимали, что в этом случае форма не должна редактироваться).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...