仅在从特定操作重定向时才允许访问操作

时间:2010-10-05 14:02:43

标签: c# .net asp.net-mvc asp.net-mvc-2

是否有一种限制对某个操作的访问权限的好方法,因此如果您从另一个操作重定向,则只能访问该操作。例如:

    [HttpPost]
    public virtual ActionResult Create(MyViewModel vm)
    {            
        if (ModelState.IsValid)
        {
            // do some work

            return RedirectToAction("CreateSuccess");
        }
        else
        {
            return View(vm);
        }
    }


    public virtual ActionResult CreateSuccess()
    {
        // only allow execution if you were redirected from Action "Create" 
    }

4 个答案:

答案 0 :(得分:7)

一种简单的方法是在第一个方法中将标记存储在TempData中,并检查重定向到的方法中是否存在该标志。
TempData用于在操作请求之间传递状态信息,并且只会持续请求的持续时间,因此您无需担心将其清除。

答案 1 :(得分:2)

除非您包含指示此类的参数,否则无法知道“来自”操作。最简单的方法是附加“SourceAction”或“FromAction”参数,并在“目标”操作中进行检查。

答案 2 :(得分:1)

问题是,你为什么要那样做?也许有一个更好的解决方案可以解决您的主要问题。

无论如何,您可以使用HttpContext.Current.Request.UrlReferrer属性来检查上一页Url。

答案 3 :(得分:0)

第一种解决方案

你可以这样做:

[HttpPost]
public virtual ActionResult Create(MyViewModel vm)
{            
    if (ModelState.IsValid)
    {
        // do some work
        return this.CreateSuccess();
    }
    else
    {
        return View(vm);
    }
}

[NonAction]
public virtual ActionResult CreateSuccess()
{
    // do what's needed 
}

最后一个方法只能从其他操作方法执行。但它本身不能执行。

第二种解决方案

如果您知道可以重用此属性,也可以通过创建自定义操作方法选择器属性来解决此问题。您可以编写一个自定义操作方法选择器属性来检查请求引用并使用适当的方法。

了解custom action selector attributes