Asp.net core TempData give 500 error when adding list and redirect to another view

后端 未结 3 1024
清歌不尽
清歌不尽 2020-12-31 08:40

I am try to build alerts list and added them to TempData. But it work if I did not do redirect. When I do redirect it give me 500 error. I set break point in vi

相关标签:
3条回答
  • 2020-12-31 09:06

    Did you configure Session? TempData is using session behind the scenes.

    Project.json

    "Microsoft.AspNetCore.Session": "1.1.0"
    

    Here is the Startup.cs file. - ConfigureServices method

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddSession();
        services.AddMvc();
    }
    

    And Configure method.

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
    {
        app.UseSession();
            app.UseMvc(routes =>
            {
                routes.MapRoute(
                        name: "default",
                        template: "{controller=Home}/{action=Index}/{id?}");
        });
    }
    

    Now try with TempData, it will work.

    And you can set the environment with set ASPNETCORE_ENVIRONMENT=Development environment variable.

    0 讨论(0)
  • 2020-12-31 09:09

    This is what I use to enable Session and Temp data on Core Runtime 2.0.6.

    ConfigureServices Section of Startup

    // Add MVC service.
    services.AddMvc(config =>
    {
        // Configure global usage of antiforgery tokens.
        config.Filters.Add(new AutoValidateAntiforgeryTokenAttribute());
    })
    .AddSessionStateTempDataProvider();
    
    // Adds the ability to use session variables.
    services.AddSession(options =>
    {
        options.Cookie.HttpOnly = true;
    });
    
    0 讨论(0)
  • 2020-12-31 09:15

    Finally I figured it out what's the issue after digging into the source code. Asp.Net Core MVC not supported complex data type for TempData currently. It only support string for now. It through this exception while serialize data, if we pass other then string.

    The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type 'MvcSandbox.Controllers.Alert'.

    I serialize my list to json and then save in TempData.

    Here is how I did this. I create extension method to add and retrieve data from TempData.

    const string Alerts = "Alerts";
    public static List<Alert> GetAlert(this ITempDataDictionary tempData)
    {
        CreateAlertTempData(tempData);
        return DeserializeAlerts(tempData[Alerts] as string);
    }
    
    public static void CreateAlertTempData(this ITempDataDictionary tempData)
    {
        if (!tempData.ContainsKey(Alerts))
        {
            tempData[Alerts] = "";
        }
    }
    public static void AddAlert(this ITempDataDictionary tempData, Alert alert)
    {
        if(alert == null)
        {
            throw new ArgumentNullException(nameof(alert));
        }
        var deserializeAlertList = tempData.GetAlert();
        deserializeAlertList.Add(alert);
        tempData[Alerts] = SerializeAlerts(deserializeAlertList);
    }
    public static string SerializeAlerts(List<Alert> tempData)
    {
        return JsonConvert.SerializeObject(tempData);
    }
    public static List<Alert> DeserializeAlerts(string tempData)
    {
        if(tempData.Length == 0)
        {
            return new List<Alert>();
        }
        return JsonConvert.DeserializeObject<List<Alert>>(tempData);
    }
    

    Add Alert it TempData

     tempData.AddAlert(new Alert(AlertClass, Message));
    

    Finally get 'TempDatainView' and display.

    @if (TempData.GetAlert().Count > 0)
    {
        <div class="alert-container">
            @foreach (var alert in TempData.GetAlert())
            {
                <div class="alert @alert.AlertClass alert-dismissible">
                    <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button>
                    @alert.Message
                </div>
            }
        </div>
    }
    
    0 讨论(0)
提交回复
热议问题