Передача 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;

Последнее, что я хочу сделать, это передать его в индексное представление, но не знаю как. В настоящее время я передаю модель из индекса.

Скажите, если это что-то еще, что вы хотели бы увидеть. Как зависимости.

Вся помощь, которую я получаю, - золото, и я буду очень признателен!!!

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

Другие вопросы по тегам