Передача 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 работает в методе, на который я перенаправляю.