Я не понимаю [Bind (Exclude = "ID")] в MVC - PullRequest
3 голосов
/ 08 марта 2012

Я действительно смущен этим ... все еще.

Я задал похожий вопрос на этот вопрос раньше, но сейчас я задам его еще проще.

Я вижу это во многих примерах и руководствах. Как вы можете поместить [Bind (Exclude = "ID")] на всю модель и рассчитывать на ее редактирование? Если вы получаете упаковывать все свойства модели в POST, но не в ID, то как узнать, какой ID редактировать?

Даже если я использую ViewModels ... я, вероятно, создаю их без идентификаторов. Так что в этом случае ... также ... как мне узнать, какой идентификатор был обновлен при редактировании?

Да, я понимаю, что в этом есть элемент "безопасности". Люди могут похитить идентификатор ... поэтому мы должны помешать людям обновлять значение во время POST. Но ... каков правильный способ обработки изменений? Что такое обычная практика?

Я чувствую, что упускаю что-то ОЧЕНЬ тривиальное.

Ответы [ 2 ]

3 голосов
/ 08 марта 2012

В MVC запросы обрабатываются механизмом связывания модели, когда клиент делает запрос. Если вы включаете модели в свои контроллеры, то, насколько я знаю, вам действительно нужно указать модель, к которой вы хотите привязаться, добавив префикс в качестве аргументов к имени модели (если только у вас нет только одного аргумента, который является моделью)

SomeModel_ID

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

Теперь, почему мы можем исключить всю модель? Ну, не все аргументы контроллера предварительно обрабатываются компоновщиком модели. Например, RedirectToAction не проходит через механизм связывания модели, поэтому в данном случае вполне возможно создать новую модель в действии контроллера POST и перенаправить на действие контроллера GET, передавая очищенную модель. Эта модель не может быть заполнена клиентом, но мы можем заполнить ее самостоятельно на стороне сервера.

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

Обновление

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

2 голосов
/ 08 марта 2012

Вы знаете идентификатор, потому что он передается вам через адрес страницы. Итак:

http://yoursite.com/admin/users/edit/20

Заполнит ваш параметр ID 20. Если он используется в POST (т. Е. Информация заполняется), просто заполните поле ID вручную и передайте его контроллеру базы данных любым способом, который вы разработали.

Это также невосприимчиво к (тривиальным) угонам, потому что если бы они написали какой-то другой идентификатор, кроме 20, они бы не обновляли пользователя с идентификатором 20, не так ли? :)

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