我正在开发一个使用MVC作为击倒js基础的应用程序。会向ApiController进行Ajax调用,以提供页面等的模型。该站点以向导的方式运行,因此用户可以进入第一页并进入第三页进行付款。
我想知道是否有一种很好的干净方法来确保在会话中没有特定变量的情况下登陆任何页面都会导致RedirectToAction("","Home")
发生。
此刻,我在apicontroller中只是设置一个会话变量,并在每个后续页面上对其进行检查。如果存在,则允许显示页面。如果没有,我将重定向到“主页”。在“感谢您购买东西”页面上,我清除了所有会话变量。
这是每个控制器上必须具有的逻辑,并且会话var必须是顺序的,这似乎具有代码味道。
public ActionResult Index()
{
FoundationFundsModel request = ControllerContext.HttpContext.Session["FoundationFund"] as FoundationFundsModel;
if (request == null)
{
return this.RedirectToAction("", "Donate");
}
PaymentPageModel model = new PaymentPageModel().WithDefaults();
return View(model);
}
如何在每个页面的Controller上不使用一堆会话变量和ActionResult的情况下完成此任务?
答案 0 :(得分:1)
我想确保分享发现的结果
namespace Foundation.Website.Filters
{
public class RedirectToHome : ActionFilterAttribute
{
/*
public override void OnResultExecuting(ResultExecutingContext filterContext)
{
//You may fetch data from database here
base.OnResultExecuting(filterContext);
}
*/
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var controllerName = filterContext.RouteData.Values["controller"];
var actionName = filterContext.RouteData.Values["action"];
// This is incomplete, but demonstrates a working example
if ((string) controllerName != "Foundation")
{
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new
{
controller = "Foundation",
action = "Index"
}));
}
答案 1 :(得分:0)
您可以执行以下操作
public class BaseController : Controller
{
public new string Request { get; set; }
protected override void Initialize(RequestContext requestContext)
{
base.Initialize(requestContext);
Request = requestContext.HttpContext.Session["FoundationFund"].ToString();
}
}
现在从此基本控制器和访问请求属性继承其他控制器
public ActionResult Index()
{
if(Request==null)
return View();
}