使用RedirectToAction传递TempData

15

介绍: 我是一名.NET学生,正在学习ASP.NET Core MVC,请您谅解。我已经在网上搜索了问题的答案,但没有找到适合我的解决方案。

问题: 我想在创建帖子方法中传递验证消息到索引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 但是我得到了这个消息:

ErrorPage

我知道第二个指南中的这行代码可能很重要,但不知道如何应用它。-

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

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

如果有更多需要查看的内容,请告诉我。 像依赖项之类的。

我非常感谢您提供的任何帮助!

5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
34

在谷歌搜索 "asp.net core redirect to action tempdata" 时,我发现了这个问题,并找到了答案。我将其发布在这里,供后人参考。

问题

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

解决方案

根据 HamedH 的回答(链接)

如果你正在运行 ASP.NET Core 2.1,请打开 Startup.cs 文件,并确保在您的 Configure() 方法中,app.UseMVC(); 之后使用 app.UseCookiePolicy();

例如:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    ...

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

    app.UseCookiePolicy();
}

2
我尝试了各种解决方案。将UseCookiePolicy移动到末尾解决了我的问题。 - Gary
对我来说不起作用... 这个在一两周前还能工作,但现在没有任何 TempData 能够工作。 - Lucas
1
这是非常糟糕的建议:“我会修复错误,但可能会破坏其他一切。” 你真的不想在管道末尾使用 UseCookiePolicy 中间件。 - Miroslav Holec

14

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

Project.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中了吗? - AllramEst
1
请查看此文章以了解TempData和ViewBag之间的区别:http://www.dotnettricks.com/learn/mvc/viewdata-vs-viewbag-vs-tempdata-vs-session - Ahmar

3

TempData 在用户的 Session 下存储数据。您需要启用会话(正如异常消息所说)。查看此手册

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


不是的。默认情况下,使用基于cookie的提供程序,如果您想要切换到基于会话的提供程序,则需要额外的努力。 - Miroslav Holec

3

提供者

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

会话仅是一种替代方案

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

Cookie同意

ASP NET Core 2.1有一些基于cookie的新GDPR功能。默认情况下,只有在用户同意存储数据时才应将数据存储在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;
});

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


0
我只是为那些在ASP.NET MVC应用程序中遇到这个问题的人发布这篇文章,@Ahmar的答案让我去查看我的注销方法,我在重定向到登录页面之前使用了Session.Abandon()。 我刚刚将其更改为Session.Clear()以重置会话而不是完全删除它,现在TempData在我重定向到的方法中正在工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,