我有一个重定向到另一个动作的控制器,例如
mysite.com/food/3
此操作对名为RedirectToAction
的操作执行Cake
并传入id = 3.
如果用户未在此时进行身份验证,则返回登录页面,但RedirectUrl为/Cake
(未提及ID),而不是/food/3
。一旦您登录,这会导致错误,因为首先它不应该通过浏览器中的URL访问,其次因为参数已经消失。
是否有一种简单的方法可以确保它重定向到浏览器中的原始URL,或者我是否必须编写自定义授权属性并存储查找表以获取父页面?
答案 0 :(得分:0)
要抓住这一个。
Food
和Cake
获取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
;另一种方法是从查询字符串中提取它。我已经在下面展示了两个例子。
登录
Login (string returnUrl = string.Empty)
{
ViewBag.ReturnUrl = returnUrl;
return View();
}
Login.cshtml
Model.ReturnUrl = ViewBag.ReturnUrl;
登录
Login ()
{
return View();
}
Login.cshtml
Model.ReturnUrl = Request.QueryString["ReturnUrl"];
如果这还不够,请发表评论,我可以尝试进一步修改此答案。