Примените фильтр действия к каждому контроллеру только в одной части сайта MVC ASP.NET?

Это существует, но вместо 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

5
задан Community 23 May 2017 в 11:45
поделиться

4 ответа

Сначала я подумал, что это может быть так же просто, как добавить новый маршрут вроде этого:

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 ). Другими словами, вы действительно должны увидеть снижение производительности для обычных пользователей, поскольку вы

4
ответ дан 14 December 2019 в 13:45
поделиться

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.

1
ответ дан 14 December 2019 в 13:45
поделиться

Вы можете довольно легко решить эту проблему, создав базовый класс контроллера, который проверяет уровень пользователя в 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>
1
ответ дан 14 December 2019 в 13:45
поделиться

Это «нестандартный» ответ:

А как насчет использования блока внедрения политики в entLib? С его помощью вы можете создать политику, которая будет запускать «предварительный метод» для вашего действия. Возможно, ваш предварительный метод поможет решить вашу проблему.

0
ответ дан 14 December 2019 в 13:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: