0

Dans MVC J'ai un service enregistré en Startup-je utiliser pour valider des actions comme ceci:MVC ActionFilterAttribute - Obtenir une valeur de l'action

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"])); 
} 

Il est flac ensuite tout ce qui nécessite une vérification sur l'accès.

Controller:

[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()); 
} 

Tout ce que je dois faire est de passer une valeur de l'action d'exécution pour être lu par le ActionFilterAttribute. Maintenant, parce que j'ai besoin et que je veux que le service initialise dans le Startup.cs je ne peux pas trouver un moyen de passer une valeur - s'il vous plaît dites-moi ce que je néglige.

Comme vous pouvez le voir j'ai essayé routedata, information de session ... mais tout ce qui est défini dans l'action réelle que je ne peux pas lire dans le ActionFilterAttribute, il renvoie juste null pour tout cela.

Quelqu'un peut-il me dire avec cette configuration, comment je peux lire une valeur de l'action qui est en cours d'exécution?

Service:

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

Utilisez-vous ASP.NET Core? –

+0

Oui, y at-il quelque chose de spécifique à cela? – Monolithcode

Répondre

0

Vous devez utiliser HttpContext.Items pour cela. Pour la valeur magasin:

context.Items["key"] = value; 

et pour obtenir la valeur de retour

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

a résolu. Décidé de retirer les deux services de l'initialiseur et de les prendre du contrôleur à la place - maintenant je peux simplement passer dans ma clé requise.