说明: 我是一名试图学习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但我收到了这条消息:
我知道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); }
我想做的最后一件事是将它传递给索引视图,但不知道如何。我目前正在从索引传递一个模型。
告诉我你是否还想看到它。喜欢依赖。
我得到的所有帮助都是黄金,非常感谢!!!
答案 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;
});
我强烈建议您在复制/粘贴之前考虑一下。