2009-05-25 13 views
1

J'utilise MVC avec C#. Je dois amener l'utilisateur à une page de paiement si l'utilisateur n'a pas payé pour un article. Je dois avoir une classe commune pour vérifier cette fonctionnalité et rediriger vers la page de paiement. Comme l'héritage de tous les contrôleurs à un contrôleur de base.Rediriger vers Page quand non payé

Dans ce contrôleur de base, je dois vérifier ce statut de paiement pour un contrôleur et des actions (à savoir ViewPage) et rediriger vers la page de paiement.

S'il vous plaît quelqu'un suggérer la meilleure façon de le faire

Répondre

1

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 
+0

RedirectToAction n'est pas accessible dans la méthode CreatePaymentRequiredViewResult. – Prasad

+0

Hmm oui j'ai peut-être trop simplifié, quand j'ai modifié notre code de production pour cet exemple. Mise à jour de mon exemple ... –

1

Je vous suggère de le faire avec une action attribuiez

0

Création d'ActionFilter personnalisé est la meilleure solution. Vous pouvez télécharger la source ASP.NET MVC et regarder la classe System.Web.Mvc.AuthorizeAttribute. Je pense que c'est un bon point de départ pour vous.

Questions connexes