Передача 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, но я получил это сообщение:
Я знаю, что эта строка из № 2 может быть важной, но сейчас не знаю, как ее применить. -
var product = TempData["myTempData"] as Product;
Последнее, что я хочу сделать, это передать его в индексное представление, но не знаю как. В настоящее время я передаю модель из индекса.
Скажите, если это что-то еще, что вы хотели бы увидеть. Как зависимости.
Вся помощь, которую я получаю, - золото, и я буду очень признателен!!!
3 ответа
Вы настроили сессию? 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
переменная окружения.
Я приземлился на этот вопрос во время поиска в Google для "перенаправления ядра asp.net к действию tempdata". Я нашел ответ и выкладываю его здесь для потомков.
проблема
Моя проблема заключалась в том, что после заполнения некоторых TempData
ценности и призвание RedirectToAction()
, TempData
будет пустым на странице, на которую я перенаправляю.
Решение
Ответ Хамеда здесь: Если вы используете 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();
}
TempData
хранит данные на стороне сервера под пользовательским сеансом. Вам необходимо включить сеансы (как говорится в сообщении об исключении). Проверьте это руководство.
Если вы не хотите использовать сессии - вам нужен какой-то другой способ хранения данных (куки?)
Провайдеры
TempData использует различных провайдеров для хранения состояния. По умолчанию используется поставщик данных на основе файлов cookie.
Сессия - это просто альтернатива
Если ваше приложение не использует сеанс, я не вижу смысла использовать его только для хранилища TempData.
Согласие на использование файлов cookie
В ASP NET Core 2.1 есть несколько новых функций GDPR на основе файлов cookie. По умолчанию данные должны храниться в файлах cookie только с согласия пользователя. Если пользователь не согласен с хранением данных в файлах cookie, TempData не может работать. Это поведение зависит от версии ASP NET Core.
Если вы не хотите хранить какие-либо конфиденциальные данные в файлах cookie, вы можете изменить настройки.
app.UseCookiePolicy(new CookiePolicyOptions
{
CheckConsentNeeded = context => false
});
Вы можете установить CookiePolicyOptions
отдельно в ConfigureServices. Это довольно чище.
История продолжается
У нас есть два типа данных в файлах cookie. Важные данные (необходимы для работы приложения) и второстепенные (некоторые пользовательские данные). Для несущественных данных необходимо согласие пользователя. TempData несущественна. Вы можете установить TempData как необходимые, и согласие пользователя больше не требуется:
services.Configure<CookieTempDataProviderOptions>(options => {
options.Cookie.IsEssential = true;
});
Я настоятельно рекомендую подумать об этом перед копированием / вставкой.
Я просто отправляю это всем, кто сталкивается с этой проблемой в приложении ASP.NET MVC, ответ @Ahmar заставил меня взглянуть на мой метод выхода из системы, я использовал Session.Abandon() перед перенаправлением на страницу входа.
Я просто изменил его на Session.Clear(), чтобы сбросить сеанс вместо его полного удаления, и теперь TempData работает в методе, на который я перенаправляюсь.