Ответы, написанные здесь, чрезвычайно устарели или даже иногда не имеют смысла. Многое изменилось со старого 2009 года, поэтому я постараюсь ответить на него правильно.
Краткий ответ - вам определенно следует минимизировать HTML . Это тривиально сегодня и дает примерно 5% ускорение . Для более длинного ответа прочитайте весь ответ
В старые времена люди вручную минимизировали css / js (запустив его через какой-то конкретный инструмент для минимизации). Было довольно сложно автоматизировать процесс и определенно требовал определенных навыков. Зная, что многие сайты высокого уровня даже сейчас не используют gzip (что тривиально), понятно, что люди неохотно минимизировали html.
Так почему же люди минимизировали js, а не html ? Когда вы минимизируете JS, вы делаете следующее:
var isUserLoggedIn
до var a
) Что дало много улучшений даже в старые времена. Но в html вы не могли сменить длинные имена на короткие, к тому же было почти нечего комментировать. Таким образом, единственное, что осталось, это удалить пробелы и переводы строк. Который дает только небольшое количество улучшения.
Один неверный аргумент, написанный здесь, заключается в том, что, поскольку контент подается с помощью gzip, минимизация не имеет смысла. Это совершенно неправильно. Да, имеет смысл, что gzip уменьшает улучшение минификации, но зачем вам gzip комментарии, пробелы, если вы можете правильно их обрезать и gzip только важную часть. Это то же самое, что если у вас есть папка для архивирования, в которой есть какая-то хрень, которую вы никогда не будете использовать, и вы решаете просто сжать ее вместо очистки и застегнуть ее.
Другой аргумент, почему бессмысленно заниматься минимизацией, заключается в том, что это утомительно. Возможно, это было правдой в 2009 году, но после этого появились новые инструменты. Прямо сейчас вам не нужно вручную уменьшать разметку. С такими вещами, как Grunt , тривиально установить grunt-contrib-htmlmin и настроить его для минимизации вашего html. Все, что вам нужно, это как 2 часа, чтобы выучить хрюканье и все настроить, а затем все будет выполнено автоматически менее чем за секунду. Похоже, что 1 секунда (которую вы можете даже автоматизировать, чтобы ничего не делать с grunt-contrib-watch ), на самом деле не так уж плоха, примерно для 5% улучшений (даже с gzip).
Еще один аргумент в том, что CSS и JS являются статическими , а HTML генерируется сервером, поэтому вы не можете предварительно минимизировать его. Это было также верно в 2009 году, но в настоящее время больше и больше сайтов выглядят как одностраничное приложение, где сервер тонкий, а клиент выполняет всю маршрутизацию, создание шаблонов и другие. логика. Таким образом, сервер только дает вам JSON , а клиент отображает его. Здесь у вас есть много HTML для страницы и различных шаблонов.
Итак, чтобы закончить мои мысли:
Атрибут авторизации может получить отправление из параметров действия или данных маршрута и затем принять решение.
Для номера 1 существует ряд шаблонов, которые обеспечивают расширенное поведение в объектах предметной области. При двойной отправке вы передаете ссылку на абстракцию (интерфейс) службы методу объекта. Тогда он сможет делать свое дело. Вы также можете написать прикладную службу, которая принимает Отгрузку и выполняет работу.
По номеру 2, не обязательно. Возможно, вам придется абстрагировать концепцию «контекстной доставки» в сервисе, который определяет, в каком контексте доставки вы находитесь. Но я бы сказал это, пока она вам снова не понадобится.
В дополнение к приведенному выше ответу вы можете верните HttpUnauthorizedResult вместо создания собственного представления для NotAuthorized. Это приведет к перенаправлению на страницу входа и будет вести себя так же, как обычный атрибут [Authorize]
Вы можете взглянуть на Rhino.Security , его можно использовать для реализации авторизации пользователей в таких сценариях.
Я не вижу проблем с методом Action, выполняющим в нем дальнейшие проверки авторизации. Вы можете использовать поставщика ролей для детальной авторизации, которую вы ищете. Пожалуйста, извините за мой синтаксис - вероятно, он грубый, и я его не тестировал.
[Authorize(Roles="Shipping, Accounting")]
public ActionResult Edit(int id)
{
Shipment shipment = repos.GetShipment(id);
switch (shipment.State)
{
case ShipmentState.A:
if (Roles.IsUserInRole("Shipping"))
return View(shipment);
else
return View("NotAuthorized");
break;
case ShipmentState.B:
if (Roles.IsUserInRole("Accounting"))
return View(shipment);
else
return View("NotAuthorized");
break;
default:
return View("NotAuthorized");
}
}