public ActionResult Update(
[Bind(Include = "UserId, Email")] UserData userData)
Механизм сопоставления комплексных параметров форм с параметрами методов действий в MVC Framework значительно упрощается с помощью встроенного средства DefaultModelBinder
. Этот механизм может гибко настраиваться с помощью атрибута BindAttribute
, который позволяет задавать списки допустимых и недопустимых для сопоставления свойств и, вдобавок к этому, переопределять префикс, используемый в представлении. Если же разработчику недостаточно функционала механизма Model Binding по умолчанию, он волен переопределить этот механизм своей реализацией и использовать его как глобально во всем приложении, так и определяя его для конкретного параметра определенного действия.
Советы по использованию контроллеров
Атрибуты ActionNameSelectorAttribute и ActionNameAttribute
В механизме MVC существует множество полезных функций. Одна из них — это атрибут ActionNameAttribute
, являющийся реализацией атрибута ActionNameSelectorAttribute
— механизма MVC Framework, который позволяет ограничить выбор методов класса контроллера при определении нужного.
Атрибут ActionNameSelectorAttribute
содержит всего один метод IsValidName
со следующим определением:
public abstract bool IsValidName(ControllerContext controllerContext,
string actionName, MethodInfo methodInfo);
При поиске необходимого для выполнения действия механизм MVC Framework, кроме всего прочего, проверит все действия на наличие атрибута, реализующего ActionNameSelectorAttribute
. В случае, когда такой атрибут найден, у него вызывается метод IsValidName
для проверки на соответствие действия требуемому имени.
Единственная реализация ActionNameSelectorAttribute
, существующая в MVC Framework, — это атрибут ActionNameAttribute
, который призван предоставить возможность создания псевдонимов для методов действий. Рассмотрим следующий фрагмент кода:
[ActionName("UserList")]
public ActionResult GetUserListFromCache()
Здесь методу GetuserListFromCache
, который представляет собой действие контроллера, присваивается укороченный псевдоним userList
. После этого в ответ на запрос действия UserList
контроллером может быть вызван метод GetuserListFromCache
.
Наследование контроллеров
При работе с контроллерами в MVC Framework полезной практикой является механизм наследования контроллеров. Так как контроллеры представляют собой классы, преимущества наследования контроллеров схожи с преимуществами наследования классов в C#. Основным таким преимуществом является возможность создания базового набора правил для некоторого количества контроллеров. Для этого в MVC Framework можно определить контроллер, который будет называться базовым, и наследовать все остальные контроллеры от него.
Далее перечислены примеры возможных функций базовых контроллеров:
□ хранение и предоставление информации о текущем пользователе и его правах;
□ предоставление информации о базовых настройках приложения, которые могут поставляться, например, из web.config;
□ экземпляры хранилищ кода для работы с разнообразным функционалом: от пользователей до специфических данных приложения;
□ вспомогательные статические или другие методы утилитарного характера;
□ определение набора атрибутов, которые будут наследовать потомки базового контроллера.
Рассмотрим простейший пример базового контроллера. Для этого определим для него набор функционала: обработку ошибок, GZip-сжатие результатов действий, вспомогательную функцию для работы с пользователем и загрузчик некоторых параметров из файла web.config.
Листинг 4.7. Базовый контроллер
[HandleError(View = "AdminError")]
[GZipCompress]
public class BaseController : Controller
{
public NameValueCollection Settings
{
get
{
return ConfigurationManager.AppSettings;
}
}
public string UserNotFoundMessage
{
get
{
return Settings["userNotFoundMessage"];
}
}
public readonly MembershipProvider MP = Membership.Provider;
public virtual ActionResult Index()
{
return View();
}
public static MembershipUser GetUser(string userName)
{
MembershipProvider mp = Membership.Provider;
return mp.GetUser(userName, false);
}
public static MembershipUser GetUser(Guid userId)
{
MembershipProvider mp = Membership.Provider;
return mp.GetUser(userId, false);
}
}
Базовый контроллер из листинга 4.7 обладает следующими свойствами:
□ определяет для контроллера действие по умолчанию Index
;
Читать дальше
Конец ознакомительного отрывка
Купить книгу