由于授权而自动重定向页面时丢失viewbag变量

本文关键字:变量 viewbag 重定向 于授权 授权 | 更新日期: 2023-09-27 18:10:52

  1. 我有一条ViewBag字符串消息。此消息是从操作链接传递到控制方法的。然后可以在基于viewbag消息的操作方法中使用一些逻辑。

  2. 同样,操作结果可以设置viewbag消息,这样当加载视图页面时,jquery会比较viewbag信息,如果有任何匹配,就会显示toast消息。

  3. 这就要求我能够控制程序的流程。所以我知道哪种方法将处理actionlink。

  4. 问题是,使用实体框架的用户标识。如果该方法被授权阻止,则会自动绕过该方法,并向用户显示登录页面。

  5. 这意味着,我的剃须刀不会将任何信息传递给特定的方法。

ActionLink有viewbag消息->作为参数传递给控制器
控制器设置消息->加载页面时,将检查消息。

我一直在将 string ViewBag.Message从视图传递给控制器,在整个项目中使用toastr创建弹出窗口。它运行良好。

我有一个项目,当用户想要签出时,它使用内置UserIdentity中的[Authorize]

[Authorize]
public ActionResult Checkout(string message)
{

问题是,消息从未传递给LoginAction方法。

[AllowAnonymous]
public ActionResult Login(string message,string returnUrl)
{

我已尝试在视图中创建消息。

@{
    string message = ViewBag.Message;
}
/.../
@Html.ActionLink("Go To Check Out", "Checkout", "Carts", 
new {message = "You Need to Login to Checkout!" })

我试着弄清楚我是否可以确定哪个链接被用来调用登录视图。我断断续续地做了一段时间了
我不知道怎么做,我想如果我知道怎么做就好了
感谢您的帮助。

编辑

工作原理:

[HttpPost]
    public ActionResult RemoveFromCart(int prod_id)
    {
        Cart cart = (Cart)Session["Cart"];
        cart.RemoveFromCart(prod_id);
        return RedirectToAction("Index", new { message = "Cart Updated!" });
    }

带索引:

@section Scripts {
    <script src="~/Scripts/jquery-2.1.4.js"></script>
    <link href="~/Content/toastr.css" rel="stylesheet" />
    <script src="~/Scripts/toastr.js"></script>
    <script src="~/Scripts/toastr.min.js"></script>
    <script type="text/javascript">
    $(document).ready(function () {
        if ('@ViewBag.Message' == "Cart Updated!") {
            toastr.options.timeOut = 1500; // 1.5s
            toastr.success('@ViewBag.Message');
        }
        if ('@ViewBag.Message' == "Login Successful!") {
            toastr.options.timeOut = 1500; // 1.5s
            toastr.success('@ViewBag.Message');
        }
        if ('@ViewBag.Message' == "Registration Successful!") {
            toastr.options.timeOut = 1500; // 1.5s
            toastr.success('@ViewBag.Message');
        }
    });
</script>
}

因此,事实上,viewbag消息是在控制器中设置的,然后在加载页面时(在jquery中(比较消息
所以我试着从头开始做,因为我已经智穷于想办法了。

因此,我想对帐户/登录控制器进行检查,我需要检查登录是否来自试图在未登录的情况下注销的用户,并且由于它只是使用[授权]安全检查重定向到那里,我不知道如何做到这一点。

    [AllowAnonymous]
    public ActionResult Login(string message,string returnUrl)
    {
        if (message == null)
        {
            message = "";
        }
   // Algorithm - IF this was redirected from an attempt to checkout without being logged in. Have the view bag message =="You Need to Login to Checkout!"
        
        ViewBag.ReturnUrl = returnUrl;
        
        return View();
    }

这样,当加载登录页面时,将出现一条toast消息,因为加载每个页面时都会检查该消息。

编辑402128841442222,但仍然不是wiki;(

问题的解释如下。

ViewBag&ViewData:

有助于在从控制器移动到视图时维护数据
曾经将数据从控制器传递到相应的视图
寿命短意味着发生重定向时,值变为null
这是因为他们的目标是提供一种在控制器和视图之间进行通信的方式。它是服务器调用内的通信机制。

什么是ViewData、ViewBag和TempData用于在当前和后续请求之间传递数据的MVC选项

所以我想我需要找到另一种方法来做这件事,欢迎任何想法。

由于授权而自动重定向页面时丢失viewbag变量

如果您试图将属性作为GET参数传递给您的操作,则表明您使用了错误版本的@Html.ActionLink

这个方法大约有一百五十万个重写。您正在将new message = { "blah" }传递给HtmlAttributes——这些将在<a>标记上作为html属性可见。您需要使用此覆盖:

@Html.ActionLink("Go To Check Out", "Checkout", "Carts", new { @class ="cssClass-for-link"}, new { message ="You Need to Login to Checkout!"})

我通过删除注释[Authorize]来解决这个问题,并检查用户是否已登录,如果用户未登录,则使用字符串消息重定向到登录页面。

// [Authorize]
public ActionResult Checkout(string message)
{
    if(message==null)
    {
        message = "";
    }
    ViewBag.Message = message;
    if (!User.Identity.IsAuthenticated) {
        return RedirectToAction("Login","Account", new { message = "You Need to Login to Checkout!" });
    }
    /.../