未付款时重定向到页面

时间:2009-05-25 10:57:27

标签: asp.net-mvc redirect

我在C#中使用MVC。如果用户没有支付项目费用,我需要将用户带到付款页面。我需要有一个公共类来检查此功能并重定向到付款页面。

将所有控制器继承到基本控制器。在该基本控制器中,我必须检查一些控制器和操作(即ViewPage)的这种支付状态,并重定向到支付页面。

请有人建议最好的方法来做到这一点

3 个答案:

答案 0 :(得分:1)

我建议您使用操作属性

执行此操作

答案 1 :(得分:1)

像这样创建一个自定义actionFilterAttribute(此示例的工作原理是将您的项目存储在会话中,但您可以根据需要对其进行修改):

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

然后,您只需向需要此检查的所有控制器操作添加属性:

public class MyController: Controller
{
    public RedirectToRouteResult RedirectToAction(string action, string controller)
    {
        return RedirectToAction(action, controller);
    }

    [RequiresPayment]
    public ActionResult Index()
    {
        // etc

答案 2 :(得分:0)

创建自定义ActionFilter是最佳解决方案。您可以下载ASP.NET MVC源代码并查看System.Web.Mvc.AuthorizeAttribute类。我认为这是一个很好的起点。