Это существует, но вместо 16777216 (256 ^ 3) цветов, которые искал OP, есть 216 (6 ^ 3) поровну распределенных цветов в большем наборе из 256 цветов. Пример:
echo -e "\033[38;5;208mpeach\033[0;00m"
Это выведет приятный вид персикового цвета.
Разбирая эту команду: \ 033 [38; 5; 208m
\ 033 - это код перехода. [38; направляет команду на передний план . Если вы хотите изменить цвет фона, вместо этого используйте [48; . 5; - это просто часть последовательности, которая меняет цвет. И самая важная часть, 208 м , выбирает фактический цвет.
В этой 256-цветовой последовательности можно найти 3 набора цветов. Первый набор - это основной набор цветов «конфеты», или значения 0-15. Тогда есть куб распределенных цветов, от 16 до 231. Наконец, есть подробный набор оттенков серого от 232 до 255.
Вы можете найти таблицу со всеми этими значениями здесь: http://bitmote.com/index.php?post/2012/11/19/Using-ANSI-Color-Codes-to-Colorize- Your-Bash-Prompt-на-Linux # 256% 20 (8-бит)% 20colors
Сначала я подумал, что это может быть так же просто, как добавить новый маршрут вроде этого:
routes.MapRoute(
"Admin",
"Admin/{*pathInfo}",
new { controller="Admin", action="Index", pathInfo="" }
);
, а затем иметь контроллер примерно так:
public class AdminController : Controller
{
public ActionResult Index(string pathInfo)
{
//Do admin checks, etc here....
return Redirect("/" + pathInfo);
}
}
Однако, к сожалению, все варианты, которые у вас есть доступные для выполнения перенаправления (т.е. Redirect, RedirectToAction и RedirectToRoute), все они выполняют перенаправление в стиле 302. В основном это означает, что ваш / Admin / Product / Whatever
выполнит, а затем вернется в браузер, сообщая ему о перенаправлении на / Product / Whatever
в совершенно новом запросе, что означает, что вы потерял ваш контекст. Я не знаю чистого способа сохранить серверную часть перенаправления (например, Server.Transfer
в прошлом), очевидно , как и сообщество SO ...
(очевидно, это не решение, так как оно не решает вашу проблему, но я подумал, что все равно помещу его сюда, на случай, если вы могли бы использовать идеи как-то иначе)
Итак, каково реальное решение проблемы? Другая идея - использовать ActionFilter (да, я знаю, что вы сказали, что не хотите этого делать, но я думаю, что следующее будет служить вашим целям). Добавьте новый маршрут вроде этого:
routes.MapRoute(
"Admin",
"Admin/{controller}/{action}/{id}",
new { controller = "Home", action = "Index", id = "", userLevel = "Admin" }
);
, а затем добавьте ActionFilter, подобный этому (который вы можете применить ко всем запросам через объект базового контроллера, как вы упомянули):
public class ExtendedAdminViewAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
object userLevel = filterContext.RouteData.Values["userLevel"];
if (userLevel != null && userLevel.ToString() == "Admin")
{
//Do your security auth checks to ensure they really are an admin
//Then do your extra admin logic...
}
}
}
Итак, хотя он использует ActionFilter, который будет применяться ко всем запросов, единственная дополнительная работа, выполняемая в большинстве обычных случаев (например, запрос для / Product / Whatever
), - это однократная проверка этого бита данных маршрута ( userLevel
). Другими словами, вы действительно должны увидеть снижение производительности для обычных пользователей, поскольку вы
1) Разве вы не можете просто проверить роль в представлении?
<% if (HttpContext.Current.User.IsInRole ("Administrator")) { %>
// insert some admin specific stuff here
<%= model.ExtraStuff %>
% } %>
Вы можете выполнить ту же проверку в контроллере, если вам нужно установить свойства модели представления, специфичные для администратора. В вашем контроллере вы можете выполнять дополнительную обработку только тогда, когда пользователь уже аутентифицирован:
public ActionResult Details (int productId)
{
ProductViewModel model = new ProductViewModel ();
if (User.Identity.IsAuthenticated && User.IsInRole ("Administrator"))
{
// do extra admin processing
model.ExtraStuff = "stuff";
}
// now fill in the non-admin specific details
model.ProductName = "gizmo";
return View (model);
}
Единственное, что здесь отсутствует, - это перенаправление на вашу страницу входа, когда администратор пытается получить доступ к представлению без аутентификации.
2) Альтернативно если вы хотите повторно использовать представление продукта по умолчанию с некоторыми дополнительными элементами, вы можете попробовать следующее:
public class AdminController
{
[Authorize(Roles = Roles.Admin)]
public ActionResult Details(int productId)
{
ProductController productController = new ProductController(/*dependencies*/);
ProductViewModel model = new ProductViewModel();
// set admin specific bits in the model here
model.ExtraStuff = "stuff";
model.IsAdmin = true;
return productController.Details(productId, model);
}
}
public class ProductController
{
public ActionResult Details(int productId, ProductViewModel model)
{
if (model == null)
{
model = new ProductViewModel();
}
// set product bits in the model
return Details(model);
}
}
ПРИМЕЧАНИЕ: я бы предпочел решение 1), а не 2) из-за того, что вам нужно создать новый экземпляр ProductController, и это дает решать собственные проблемы, особенно при использовании IoC.
Вы можете довольно легко решить эту проблему, создав базовый класс контроллера, который проверяет уровень пользователя в OnActionExecuting и, если авторизован, устанавливает для свойства Role такое же значение и добавляет запись «Role» в ViewData для использования в представлении. Вы можете использовать его в качестве базового класса для всех ваших контроллеров, и все они будут иметь доступ к свойству Role, и все ваши представления будут иметь запись «Role», добавленную в ViewData:
public abstract class BaseController : Controller
{
public string Role { get; protected set; }
protected override void OnActionExecuting( ActionExecutingContext filterContext )
{
base.OnActionExecuting( filterContext );
Role = string.Empty;
string role = string.Empty;
object value;
if ( filterContext.RouteData.Values.TryGetValue( "role", out value ) )
role = value as string ?? string.Empty;
if ( filterContext.HttpContext.User.IsInRole( role ) )
Role = role.ToLowerInvariant();
ViewData[ "role" ] = Role;
}
}
Измените маршрут по умолчанию в Global.asax. cs:
routes.MapRoute(
"Default",
"{role}/{controller}/{action}/{id}",
new { role = "", controller = "Home", action = "Index", id = "" }
);
Теперь в действиях вашего контроллера проверьте свойство Role, например, на «admin», и, если да, добавьте необходимые данные представления для функций администратора.
Визуализируйте пользовательский интерфейс администратора, используя частичные данные и в вашем представлении, проверьте роль и вызовите RenderPartial:
<% if ( Equals( ViewData[ "role" ], "admin" ) )
Html.RenderPartial( "_AdminFunctions" ); %>
<p>
This is the standard, non Admin interface...
</p>
Это «нестандартный» ответ:
А как насчет использования блока внедрения политики в entLib? С его помощью вы можете создать политику, которая будет запускать «предварительный метод» для вашего действия. Возможно, ваш предварительный метод поможет решить вашу проблему.