Créer un ActionFilterAttribute personnalisé comme si (cet exemple fonctionne d'avoir votre article stocké dans la session, mais vous pouvez modifier cela comme nécessaire):
public abstract class RequiresPaymentAttribute : ActionFilterAttribute
{
protected bool ItemHasBeenPaidFor(Item item)
{
// insert your check here
}
private ActionExecutingContext actionContext;
public override void OnActionExecuting(ActionExecutingContext actionContext)
{
this.actionContext = actionContext;
if (ItemHasBeenPaidFor(GetItemFromSession()))
{
// Carry on with the request
base.OnActionExecuting(actionContext);
}
else
{
// Redirect to a payment required action
actionContext.Result = CreatePaymentRequiredViewResult();
actionContext.HttpContext.Response.Clear();
}
}
private User GetItemFromSession()
{
return (Item)actionContext.HttpContext.Session["ItemSessionKey"];
}
private ActionResult CreatePaymentRequiredViewResult()
{
return new MyController().RedirectToAction("Required", "Payment");
}
}
Ensuite, vous pouvez simplement ajouter un attribut à toutes les actions du contrôleur nécessitant cette vérification:
public class MyController: Controller
{
public RedirectToRouteResult RedirectToAction(string action, string controller)
{
return RedirectToAction(action, controller);
}
[RequiresPayment]
public ActionResult Index()
{
// etc
RedirectToAction n'est pas accessible dans la méthode CreatePaymentRequiredViewResult. – Prasad
Hmm oui j'ai peut-être trop simplifié, quand j'ai modifié notre code de production pour cet exemple. Mise à jour de mon exemple ... –