使用RedirectToAction传递TempData

时间:2017-01-05 18:58:57

标签: asp.net-core-mvc

说明: 我是一名试图学习ASP.NET核心MVC的.NET学生。所以请理解。我在网上搜索了我的问题的答案,但还没有找到适合我的解决方案。

问题: 我想在创建帖子时将创建帖子方法的验证消息传递给索引IActionmethod,并且它们现在将其显示为警报消息。我在网上看到ViewBag在重定向中存活,但TempData确实如此。到目前为止,这是我的代码。

创建post方法:

$query = $repository->createQueryBuilder('b')
->select('(b.course) AS course')
->leftJoin('AppBundle:Booking', 'b2', 'WITH', 'b.course = b2.course AND b.id < b2.id)
->where('b2.id IS NULL')
->orderBy('b.id', 'DESC')
->setMaxResults(5)
->getQuery();

索引方法:

 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");
    }

我试过这个指南:ClickThis而且这个:ClickThis2但我收到了这条消息:

ErrorPage

我知道2号gudie的这一行可能很重要,但现在还没有如何应用它。 -

  

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); }

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

告诉我你是否还想看到它。喜欢依赖。

我得到的所有帮助都是黄金,非常感谢!!!

5 个答案:

答案 0 :(得分:14)

我在搜索“ asp.net核心重定向到动作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();
}

答案 1 :(得分:8)

您是否配置了会话? 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环境变量设置环境。

答案 2 :(得分:3)

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

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

答案 3 :(得分:0)

我只是将其发布给在ASP.NET MVC应用程序中遇到此问题的任何人,@ Ahmar的回答让我着眼于注销方法,在重定向到登录页面之前,我正在使用Session.Abandon() 。

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

答案 4 :(得分:0)

提供商

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;
});

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