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

时间:2015-09-02 08:05:55

标签: c# asp.net-mvc asp.net-identity viewbag toastr

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

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

    < / LI>
  3. 这要求我控制程序的流程。所以我知道哪个方法将处理actionlink。

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

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

  6.   

    ActionLink有viewbag消息 - &gt;作为参数传递给控制器​​
      控制器设置消息 - &gt;加载页面时,会检查邮件。

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

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

    [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!" })
    

    如果我可以确定使用哪个链接来调用Login视图,我已经尝试过了。我一直在打开和关闭它。

    修改

    工作原理:

    [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消息,因为在加载每个页面时都会检查该消息。

    编辑402,128,841,442,222 ,仍然不是维基;)

    以下解释了这个问题。

      

    ViewBag&amp; amp;的相似之处ViewData的:

         

    帮助您在从控制器移动到视图时保持数据     习惯了   将数据从控制器传递到相应的视图    寿命短意味着   重定向发生时,value变为null    这是因为他们的目标   是提供一种在控制器和视图之间进行通信的方法。它的   服务器调用中的通信机制。

    What is ViewData, ViewBag and TempData? – MVC Options for Passing Data Between Current and Subsequent Request

    所以我想我需要找到另一种做法,欢迎任何想法。

2 个答案:

答案 0 :(得分:1)

如果您尝试将属性作为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!"})

答案 1 :(得分:0)

我通过删除注释[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!" });
    }
    /.../