RedirectToAction 不适用于 Tempdata - ASP.net 核心 MVC

Posted

技术标签:

【中文标题】RedirectToAction 不适用于 Tempdata - ASP.net 核心 MVC【英文标题】:RedirectToAction is not working with Tempdata - ASP.net core MVC 【发布时间】:2017-03-16 11:04:45 【问题描述】:

我有这种方法,我试图将请求重定向到不同的控制器。对于被调用的控制器,我需要来自前一个控制器的一些数据,所以我把它放在了 Tempdata 中。但是当我在调用 RedirectToAction 的行之前使用 Tempdata 时,所请求的根本不会传递给下一个操作

如下代码所示

public IActionResult GetAuthToken()
        
            //Logic to generate AuthToken 

            //TODO:SRI 14/03/2017 Get the UserId from the front end app, For now I am hardcoding this value

            AccountHolderDetails user = new AccountHolderDetails
            
                UserId = "123",
                FirstName = "",
                LastName = "",
                Email = "",
                Phone = "",
                Address = new UserAddress
                
                    Street = "123 anystreet",
                    City = "Brantford",
                    State = "ON",
                    Country = "CA"//,
                                  //PostalCode = "M4P1E8"
                
            ;

            var uniqueId = Guid.NewGuid();
            var authToken = GenerateAuthToken(user.UserId, uniqueId);
            var transactionRecord = CreateTransactionRecord(user,uniqueId,authToken);

            // HttpContext.Session.Set("UserData", user);

            TempData["UserData"] = user;
            TempData["TransactionData"] = transactionRecord;

            return RedirectToAction("Authorize", "Authorization");

        

我在调用redirecttoaction之前设置了Tempdata,当代码执行时它不会去授权控制器去thw授权方法。

我尝试在上面的代码中注释 tempdata 部分,它工作正常,但我需要授权控制器中的用户数据,因此使用 tempdata。我已按照核心网站的说明配置会话,所有这些都很好,如下所示,查看我的 starttup.cs 类

public void ConfigureServices(IServiceCollection services)
        
            services.AddDistributedMemoryCache();
            services.AddSession(options => 
                options.IdleTimeout = TimeSpan.FromSeconds(10);
                options.CookieHttpOnly = true;

            );

            // Add framework services.
            services.AddMvc();

            services.Configure<WireCardSettings>(Configuration);

            services.AddSingleton<ITempDataProvider, CookieTempDataProvider>();
        

        // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
        public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
        
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            if (env.IsDevelopment())
            
                app.UseDeveloperExceptionPage();
                app.UseBrowserLink();
            
            else
            
                app.UseExceptionHandler("/Home/Error");
            

            app.UseStaticFiles();

            app.UseSession();

            app.UseMvc(routes =>
            
                routes.MapRoute(
                    name: "default",
                    template: "controller=Home/action=Index/id?");
            );
        
    

【问题讨论】:

它可能无法进入 RedirectToAction 部分的原因之一是上面的代码导致了异常。尝试放置一个 try catch 块,看看上面的任何一行是否导致异常 【参考方案1】:

您必须先序列化对象,然后再将其分配给 TempData。

TempData["UserData"] = JsonConvert.SerializeObject(user);

并通过反序列化来检索对象。

var user = JsonConvert.DeserializeObject<AccountHolderDetails>(TempData["UserData"].ToString());

【讨论】:

感谢您的帮助。我一直在努力找出为什么我在 MVC 中使用的功能不起作用。

以上是关于RedirectToAction 不适用于 Tempdata - ASP.net 核心 MVC的主要内容,如果未能解决你的问题,请参考以下文章

用于注销的布局中的 RedirecttoAction 问题

RedirectToAction在控制器中工作,但不更新视图和URL

.NET MVC 是不是具有强类型的 RedirectToAction?

SPARK 网络研讨会:用于先进半导体研发的终极 S/TEM 平台

RedirectToAction 和 RedirectToRoute

asp.net mvc: 将 RedirectToAction(string, object) 变成 RedirectToAction<Controller>(x => x.Deta