0

В MVC У меня есть служба, зарегистрированном в Startup я использую для проверки действия так:MVC ActionFilterAttribute - получить значение от действия

Startup.cs

public void ConfigureServices(IServiceCollection services) 
{ 
    //services.AddCaching(); 
    services.AddSession(); 
    services.AddMvc(); 
    services.AddScoped<SessionDetails>(); 
    //services.AddTransient<IAppSettings, AppSettings>(); 
    services.AddSingleton(Configuration); 

    services.AddSingleton(MobileUnitOfWork); 
    //services.AddTransient<IMobileUnitOfWork, MobileUnitOfWork>(); 
    services.AddScoped<RoleItemKey>(); 

    //Custom Attributes 
    services.AddScoped<SiteSetting>(); 
    services.AddScoped<ValidationService>(); 
    //services.AddScoped<RequestHelper>(); 

    //services.AddEntityFramework() 
    // .AddSqlServer() 
    // .AddDbContext<QuotesAppContext>(options => options.UseSqlServer(Configuration["Data:ConnectionString"])); 
} 

Затем плюхнулся на что требует проверки доступа.

Контроллер:

[ServiceFilter(typeof(ValidationService))] 
public IActionResult MyDetails() 
{ 
    ControllerContext.RouteData.Values.Add("RoleItemKey", "MOBILE_MYHOLIDAYS_PAGE"); 
    ControllerContext.RouteData.DataTokens.Add("RoleItemKey", "MOBILE_MYHOLIDAYS_PAGE"); 
    HttpContext.Session.SetString("RoleItemKey", "MOBILE_MYHOLIDAYS_PAGE"); 
    ViewBag.RoleItemKey = RoleItemKey.MOBILE_MYHOLIDAYS_PAGE; 
    return View("~/Views/User/MyDetails.cshtml", GetDetailsModel()); 
} 

Все, что мне нужно сделать, это передать значение от исполняющего действия, которое будет прочитано ActionFilterAttribute. Теперь, поскольку мне нужно и хочу инициализировать службу в Startup.cs, я не могу найти способ передать значение - пожалуйста, скажите мне, что я пропускаю.

Как вы можете видеть, я попытался использовать routeata, информацию о сеансе ... но независимо от того, что установлено в действительном действии, которое я не могу прочитать в ActionFilterAttribute, он просто возвращает null для всего этого.

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

Услуги:

public class ValidationService : ActionFilterAttribute 
{  
    private IConfiguration _config; 
    private IMobileUnitOfWork _services; 
    private Controller _controller; 
    private ActionExecutingContext _context; 
    private readonly IHttpContextAccessor _contextAccessor; 
    private ISession _session => _context.HttpContext.Session; 
    public string Moons; 

    public ValidationService(IConfiguration config, IMobileUnitOfWork unitOfWork) 
    { 
     _config = config; 
     _services = unitOfWork; 
    } 

    /// <summary> 
    /// Ensures the page is validated before being directed 
    /// </summary> 
    /// <param name="context"></param> 
    public override void OnActionExecuting(ActionExecutingContext context) 
    { 
     var controller = context.Controller as Controller; 
     var moo = controller.HttpContext.Session.GetString("CascadeSessionToken"); 
     var mos = controller.HttpContext.Session.GetString("RoleItemKey"); 
     _context = context; 
     _controller = controller; 
     _controller.ViewBag.LoggedIn = true; 

     base.OnActionExecuting(context); 
     Validate(""); 
    } 
+0

Вы используете ASP.NET Core? –

+0

Да, его там что-то особенное для этого? – Monolithcode

ответ

0

Вы должны использовать HttpContext.Items для этого. Для сохранения значения:

context.Items["key"] = value; 

и получить значение обратно

var value = context.Items["key"]; 
0

Решенный его. Решил вывести две службы из инициализатора и получить их от контроллера вместо этого - теперь я могу просто передать свой необходимый ключ.