我在C#中使用MVC。如果用户没有支付项目费用,我需要将用户带到付款页面。我需要有一个公共类来检查此功能并重定向到付款页面。
将所有控制器继承到基本控制器。在该基本控制器中,我必须检查一些控制器和操作(即ViewPage)的这种支付状态,并重定向到支付页面。
请有人建议最好的方法来做到这一点
答案 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类。我认为这是一个很好的起点。