ЖАНРЫ

Шрифт:

public ActionResult Update(

[Bind(Exclude = "IsLockedOut")] UserData userData)

Иногда требуется задать определенный список разрешенных для сопоставления параметров. Для этого используется параметр Include, которому можно задать список разрешенных для сопоставления свойств. В следующем примере мы разрешаем для сопоставления только два свойства: Userid и Email:

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;

? определяет атрибуты по умолчанию для обработки ошибок и сжатия результатов через GZip;

? определяет обертку Settings над секцией настроек appSettings файла web.config, для более прозрачного доступа к настройкам;

? прямо определяет UserNotFoundMessage, одну из настроек секции appSettings для быстрого к ней доступа;

? определяет упрощенный доступ к объекту Membership.Provider;

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

Чтобы наделить этими свойствами любой контроллер, необходимо наследовать его от базового. Модифицируем контроллер AdminController согласно новым правилам так, как показано во фрагменте:

public class AdminController : BaseController {

[AcceptVerbs(HttpVerbs.Get)]

[Authorize(Users = "Admin")]

public override ActionResult Index

{

int userCount;

var users = MP.GetAllUsers(0, Int32.MaxValue, out userCount);

ViewData.Model = users;

return View;

}

[AcceptVerbs(HttpVerbs.Get)]

[Authorize(Users = "Admin")]

public ActionResult Select(Guid? userId)

{

if (!userId.HasValue)

Поделиться с друзьями: