Почему TryUpdateModel в классе Controller в MVC защищен? - PullRequest
0 голосов
/ 16 апреля 2011

Изначально это был вопрос о том, как выполнить задачу, но теперь это превратилось в вопрос передового опыта.

Я использую MVC (все еще плохо знакомый с ним), и я пытался создать метод, который может вызывать любой контроллер, который будет выполнять общую часть функций. В методе мне нужно было запустить метод контроллера TryUpdateModel. Это то место, где я сталкивался с препятствиями - я не смог бы сделать это, если бы метод не находился в контроллере, потому что TryUpdateModel «недоступен из-за уровня защиты» - он помечен как «защищенный». Если бы я должен был сделать этот метод закрытым для каждого контроллера, он потерял бы всю цель иметь метод в первую очередь, и я бы скопировал много кода.

Так что мне было интересно, почему этот метод защищен? Наверняка я упускаю что-то явно очевидное. (И, пожалуйста, пролить свет)

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

Мой вопрос - для тех, кто регулярно работает с MVC, эта модель плохая идея? Обычно плохая идея взять такой центральный класс, создать собственный и использовать его вместо этого?

1 Ответ

1 голос
/ 17 апреля 2011

Это защищено, потому что эти методы принадлежат к коду контроллера.Они являются расширениями контроллера, предназначенными для использования именно в контроллере.Тот факт, что они защищены, означает, что изначально задумано, чтобы это произошло в контроллере.Возьмите, например, веб-формы asp.net, Page.IsPostback вызывается из самой страницы.Обычно к контроллеру относится магия привязки модели, и, следовательно, TryUpdateModel также относится к нему.Возможно, вы слишком сильно упрощаете, но я понимаю, почему вы это сделаете.Можете ли вы абстрагироваться на один слой меньше?Используйте tryupdatemodel в вашем контроллере и любой дополнительный общий код в другом «общем» методе.
Как правило, в коде mvc в контроллере все довольно просто, так что если! TryUpdateModel (model), то вы просто возвращаете и позволяете моделям состояния / валидаторам делать свою магию,Это простой метод и в целом работает хорошо.Вы сохраняете 2/3 строки общего кода проверки, пытаясь реализовать этот другой метод?

Я не уверен, что (из-за ModelState и т. Д.) Используется другой класс, который наследуется от контроллера, цель которого - нетЭто действительно контроллер - будет работать во всех случаях - так что будьте осторожны с этим.ModelState может не передаваться должным образом и т. Д.

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