确定谁请求了操作方法

时间:2014-05-14 15:55:35

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

所以,我有两种行动方法A = public ActionResult PlaceOrder(PlaceOrderVM model)和B = public ActionResult IngredientsDeficiency()。我想知道IN B,如果B是从A重定向的结果,或者在一般重定向中。我只是想阻止用户自己请求方法B.但他们可以看到View是否是从服务器重定向。希望有人能理解......


作品

[HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public ActionResult PlaceOrder(PlaceOrderVM model)
    {
        if (ModelState.IsValid)
        {
            var cosumed = _pizzaRepository.TryConsumeIngredients(model.PizzaId);
            if (cosumed == false)
            {
                return View("IngredientsDeficiency");
            }

            _pizzaRepository.InsertOrder(model);
            _pizzaRepository.Save();

            return RedirectToAction("Orders", "User");
        }

        return View(model);
    }

不能工作

[HttpPost]
    [Authorize]
    [ValidateAntiForgeryToken]
    public ActionResult PlaceOrder(PlaceOrderVM model)
    {
        if (ModelState.IsValid)
        {
            var cosumed = _pizzaRepository.TryConsumeIngredients(model.PizzaId);
            if (cosumed == false)
            {
                return RedirectToAction("IngredientsDeficiency");
            }

            _pizzaRepository.InsertOrder(model);
            _pizzaRepository.Save();

            return RedirectToAction("Orders", "User");
        }

        return View(model);
    }

    [ChildActionOnly]
    public ActionResult IngredientsDeficiency()
    {
        return View("IngredientsDeficiency");
    }

错误:The action 'IngredientsDeficiency' is accessible only by a child request.

2 个答案:

答案 0 :(得分:1)

您可以使用ChildActionOnlyAttribute操作属性。

请参阅example here

答案 1 :(得分:0)

一种方法是在public ActionResult PlaceOrder(PlaceOrderVM model)中设置会话变量标志,并在public ActionResult IngredientsDeficiency()中检查该标志。此外,您可以使用TempData集合,数据将仅存储在下一个请求中,您不必担心删除它。

如果您不想使用会话,也可以更改public ActionResult PlaceOrder(PlaceOrderVM model)以直接返回IngredientsDeficiency的结果视图。