使用 RedirectToAction 传递 TempData

Posted

技术标签:

【中文标题】使用 RedirectToAction 传递 TempData【英文标题】:Passing TempData with RedirectToAction 【发布时间】:2017-05-20 10:40:41 【问题描述】:

简介: 我是一名尝试学习 ASP.NET Core MVC 的 .NET 学生。所以请谅解。我在网上搜索了我的问题的答案,但还没有找到适合我的解决方案。

问题: 每当创建帖子时,我想将一条验证消息从我的 create post 方法传递给索引 IActionmethod,并且它们现在将其显示为警报消息。我在网上读到 ViewBag 不会在重定向中幸存,但 TempData 可以。这是我目前的代码。

创建发布方法:

 public IActionResult CreatePost(string textContent, string headline, string type)
    

        var catType = new Category()  CategoryType = type.ToUpper() ;

        if (db.Category.Any(s => s.CategoryType.Trim().ToLower() == type.Trim().ToLower()))
            catType = db.Category.FirstOrDefault(s => s.CategoryType.Trim().ToLower() == type.Trim().ToLower());


        var newPost = new Post()
        
            Content = textContent,
            Header = headline,
            DateOfPost = DateTime.Now,
            category = catType

        ;
        db.Posts.Add(newPost);
        db.SaveChanges();

        TempData["validation"] = "Your post hase been publsihed";

        return RedirectToAction("Index");
    

索引方法:

public IActionResult Index()
        

        var validation = TempData["validation"];

            var posts = (from x in db.Posts
                         orderby x.DateOfPost descending
                         orderby x.PostID descending
                         select x);

            return View(posts);
        

我已经尝试过这个指南:ClickThis 和这个:ClickThis2,但我收到了这条消息:

我知道来自 gudie 2 号的这条线可能很重要,但现在不知道如何应用它。 -

var product = TempData["myTempData"] as Product;

我想做的最后一件事是将它传递给索引视图,但不知道如何。我目前正在从索引中传递一个模型。

如果您还想看什么,请告诉我。像依赖一样。

我得到的所有帮助都是金子,将不胜感激!!!

【问题讨论】:

【参考方案1】:

我在谷歌搜索“asp.net core redirect to action tempdata”时遇到了这个问题。我找到了答案,并将其发布在这里以供后代使用。

问题

我的问题是,在填写一些 TempData 值并调用 RedirectToAction() 后,TempData 在我重定向到的页面上将是空的。

解决方案

根据 HamedH 的回答 here: 如果您运行的是 ASP.NET Core 2.1,请打开您的 Startup.cs 文件并确保在您的 Configure() 方法中 app.UseCookiePolicy(); 位于 app.UseMVC(); 之后。

例子:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)

    ...

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

    app.UseCookiePolicy();

【讨论】:

我尝试了各种解决方案。将 UseCookiePolicy 移到最后为我解决了这个问题。 不适合我....这只是一两个星期前的工作,但现在没有 TempData 工作。 这是一个非常糟糕的建议“我会修复错误并破坏其他一切。”您真的不希望在管道末端使用 UseCookiePolicy 中间件。【参考方案2】:

您是否配置了会话? TempData 在幕后使用会话。

项目.json

"Microsoft.AspNetCore.Session": "1.1.0"

这是 Startup.cs 文件。 - ConfigureServices方法

public void ConfigureServices(IServiceCollection services)

     services.AddMemoryCache();
     services.AddSession();
     services.AddMvc();

还有Configure 方法。

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)

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

现在尝试使用 TempData,它会起作用。

您可以使用set ASPNETCORE_ENVIRONMENT=Development 环境变量设置环境。

【讨论】:

我解决了我的另一个问题。是否可以在视图中像 ViewBag 一样使用 TempData。现在我将 TempData 传递给 Index 操作中的 ViewBag? 查看这个帖子了解tempdata和viewbag的区别dotnettricks.com/learn/mvc/…【参考方案3】:

TempData 在用户会话下存储数据服务器端。您需要启用会话(如异常消息所述)。检查this manual。

如果您不想使用会话 - 您需要其他方式来存储数据(cookie?)

【讨论】:

没有。默认情况下使用基于 cookie 的提供程序,您需要额外的努力将提供程序交换为基于会话的。【参考方案4】:

提供者

TempData 使用各种提供程序来存储状态。默认情况下,使用基于 cookie 的数据提供程序。

会话只是一种选择

如果您的应用程序不使用会话,我认为没有任何理由仅将其用于 TempData 存储。

Cookie 同意

ASP NET Core 2.1 有一些新的GDPR features based on cookies。默认情况下,只有在用户同意的情况下,数据才应存储在 cookie 中。如果用户不同意将数据存储在 cookie 中,则 TempData 将无法工作。此行为因 ASP NET Core 版本而异。

如果您不想在 cookie 中保存任何敏感数据,您显然可以更改设置。

    app.UseCookiePolicy(new CookiePolicyOptions
    
        CheckConsentNeeded = context => false
    );

您也可以在 ConfigureServices 中单独设置CookiePolicyOptions。这是一个相当干净的。

故事继续

我们在 cookie 中有两种数据。基本数据(运行应用程序所需)和非基本数据(一些用户数据)。非必要数据需要用户同意。 TempData 不是必需的。您可以将您的 TempData 设置为必不可少,并且不再需要用户同意:

services.Configure<CookieTempDataProviderOptions>(options => 
   options.Cookie.IsEssential = true;
);

我强烈建议在复制/粘贴之前考虑一下。

【讨论】:

【参考方案5】:

我只是为在 ASP.NET MVC 应用程序中遇到此问题的任何人发布此消息,@Ahmar 的回答让我去查看我的注销方法,我在重定向到登录页面之前使用的是 Session.Abandon() .

我只是将其更改为 Session.Clear() 以重置会话而不是完全删除它,现在 TempData 正在我重定向到的方法中工作。

【讨论】:

以上是关于使用 RedirectToAction 传递 TempData的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Asp.NET MVC 中使用 RedirectToAction() 传递多个对象?

传递参数的mvc RedirectToAction [重复]

在 RedirectToAction 中传递对象

RedirectToAction 和 RedirectToRoute

如何在 asp.net MVC 中使用 RedirectToAction 将模型从一个 Action 方法传递到另一个?尽管我发送了一个填充模型,但我得到的是空模型

如何使用 RedirectToAction 方法添加查询字符串值?