Передача TempData с помощью RedirectToAction
Вступление:
Я учусь на .NET и пытаюсь изучить ASP.NET Core MVC. Поэтому, пожалуйста, будьте понимающими. Я искал в Интернете ответ на мою проблему, но не нашел решения, которое работает для меня.
Проблема:
Я хочу передать проверочное сообщение из моего метода создания сообщения в метод индекса IAction всякий раз, когда сообщение было создано, и они покажут его как предупреждающее сообщение. Я читал в Интернете, что 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]()
Я знаю, что эта строчка из № 2 может быть важной, но сейчас не знаю, как ее применить. -
var product = TempData["myTempData"] as Product;
Последнее, что я хочу сделать, это передать его в представление индекса, но не знаю как. В настоящее время я передаю модель из индекса.
Скажите, если это что-то еще, что вы хотели бы увидеть. Как зависимости.
Вся помощь, которую я получаю, - золото, и я буду очень признателен !!!
Ответы
Ответ 1
Вы настроили сеанс? 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
Environment.
Ответ 2
Я приземлился на этот вопрос во время поиска в Google для "перенаправления ядра asp.net к действию tempdata". Я нашел ответ и выкладываю его здесь для потомков.
Проблема
Моя проблема заключалась в том, что после заполнения некоторых значений TempData
и вызова RedirectToAction()
, TempData
будет пустым на странице, на которую я перенаправляю.
Решение
За HamedH ответ здесь:
Если вы используете 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();
}
Ответ 3
TempData
хранит данные на стороне сервера под TempData
пользователя. Вам нужно включить сеансы (как указано в сообщении об исключении). Проверьте это руководство.
Если вы не хотите использовать сеансы - вам нужен другой способ хранения данных (файлы cookie?)
Ответ 4
Я просто публикую это для всех, кто сталкивался с этой проблемой, ответ @Ahmar заставил меня взглянуть на мой метод выхода из системы, я использовал Session.Abandon() перед перенаправлением на страницу входа.
Я просто изменил его на Session.Clear(), чтобы сбросить сеанс вместо полного его удаления, и теперь TempData работает в методе, на который я перенаправляю.