当我使用RedirectToAction时如何设置ReturnUrl?

时间:2015-08-14 12:45:44

标签: asp.net-mvc asp.net-mvc-5

我有一个重定向到另一个动作的控制器,例如

mysite.com/food/3

此操作对名为RedirectToAction的操作执行Cake并传入id = 3.

如果用户未在此时进行身份验证,则返回登录页面,但RedirectUrl为/Cake(未提及ID),而不是/food/3。一旦您登录,这会导致错误,因为首先它不应该通过浏览器中的URL访问,其次因为参数已经消失。

是否有一种简单的方法可以确保它重定向到浏览器中的原始URL,或者我是否必须编写自定义授权属性并存储查找表以获取父页面?

1 个答案:

答案 0 :(得分:0)

要抓住这一个。
FoodCake获取id值并重定向参数,只需将它们自由传递到可以根据需要使用的位置。

食物

public ActionResult Food (int id, string returnUrl = string.Empty)
{
   // Do work
   return RedirectionToAction("Cake", new { id, returnUrl })
}

蛋糕

[Authorize]
Cake (int id, string returnUrl = string.Empty)
{
   // Do work
   if (returnUrl != string.Empty) 
     return Redirect (returnUrl);
   return View();
}

当View最终返回到客户端时出现问题,因为当你提交登录信息时,你必须以某种方式将returnUrl放入发布的表单中,因为你想稍后使用它。因此,第一步是将其纳入View的形式,以便将其包含在发布的模型中。一种方法是ViewBag;另一种方法是从查询字符串中提取它。我已经在下面展示了两个例子。

选项1:

登录

Login (string returnUrl = string.Empty)
{
   ViewBag.ReturnUrl = returnUrl;
   return View();
}

Login.cshtml

Model.ReturnUrl = ViewBag.ReturnUrl;

选项2:

登录

Login ()
{
   return View();
}

Login.cshtml

Model.ReturnUrl = Request.QueryString["ReturnUrl"];

如果这还不够,请发表评论,我可以尝试进一步修改此答案。