2017-01-01 2 views
4

Ich versuche, Alert-Liste zu erstellen und fügte sie zu TempData. Aber es funktioniert, wenn ich nicht weiterleiten würde. Wenn ich es umadressiere, gib mir 500 Fehler. Ich habe auch den Break Point in Sicht gesetzt, aber es hat nicht geglitten, als es anders herum gelenkt hat.Asp.net Kern TempData geben 500 Fehler beim Hinzufügen von Liste und Redirect zu einer anderen Ansicht

ActionMethod

public IActionResult Create(CategoryCreateVM input) 
{ 
    if (ModelState.IsValid) 
    { 
     var category = mapper.Map<Categories>(input); 
     categoryBL.Add(category); 

     List<Alert> alert = new List<Alert>(); 
     alert.Add(new Alert("alert-success", "success message")); 
     alert.Add(new Alert("alert-danger", "danger message")); 

     TempData["Alert"] = alert; 

     return RedirectToAction("Index"); 
    } 
    return View(input); 
} 

Wie ich in Sicht zugreifen.

@{ 
    var alerts = TempData["Alert"] as List<Alert>; 
} 
@if (alerts != null && alerts.Count > 0) 
{ 
    <div class=""> 
     @foreach (var alert in alerts) 
     { 
      <div class="alert @alert.AlertClass alert-dismissible"> 
       <button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> 
       @alert.Message 
      </div> 

     } 
    </div> 

} 

Stapelspur.

Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Mvc.ViewFeatures.dll 
Exception thrown: 'System.InvalidOperationException' in mscorlib.dll 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker: Information: Executed action MvcSandbox.Controllers.HomeController.Index (MvcSandbox) in 46.4619ms 
Exception thrown: 'System.InvalidOperationException' in mscorlib.dll 
Exception thrown: 'System.InvalidOperationException' in mscorlib.dll 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Error: An unhandled exception has occurred while executing the request 

System.InvalidOperationException: The 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' cannot serialize an object of type 'MvcSandbox.Controllers.Alert'. 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer.EnsureObjectCanBeSerialized(Object item) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\TempDataSerializer.cs:line 207 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer.Serialize(IDictionary`2 values) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\TempDataSerializer.cs:line 142 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.SessionStateTempDataProvider.SaveTempData(HttpContext context, IDictionary`2 values) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\SessionStateTempDataProvider.cs:line 62 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.TempDataDictionary.Save() in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\TempDataDictionary.cs:line 166 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.SaveTempData(IActionResult result, ITempDataDictionaryFactory factory, HttpContext httpContext) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 91 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.OnResultExecuted(ResultExecutedContext context) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 80 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.Core\Internal\ControllerActionInvoker.cs:line 1023 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeNextResourceFilter>d__22.MoveNext() in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.Core\Internal\ControllerActionInvoker.cs:line 1105 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ResourceExecutedContext context) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.Core\Internal\ControllerActionInvoker.cs:line 1377 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.Core\Internal\ControllerActionInvoker.cs:line 493 
    at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.<InvokeAsync>d__20.MoveNext() in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.Core\Internal\ControllerActionInvoker.cs:line 164 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Builder.RouterMiddleware.<Invoke>d__4.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
    at Microsoft.AspNetCore.Session.SessionMiddleware.<Invoke>d__9.MoveNext() in D:\temp\Session-dev\Session-dev\src\Microsoft.AspNetCore.Session\SessionMiddleware.cs:line 106 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() 
    at Microsoft.AspNetCore.Session.SessionMiddleware.<Invoke>d__9.MoveNext() in D:\temp\Session-dev\Session-dev\src\Microsoft.AspNetCore.Session\SessionMiddleware.cs:line 123 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 
Exception thrown: 'System.InvalidOperationException' in Microsoft.AspNetCore.Http.dll 
Microsoft.AspNetCore.Server.Kestrel: Error: Connection id "0HL1I8OFS17SU": An unhandled exception was thrown by the application. 

System.InvalidOperationException: Session has not been configured for this application or request. 
    at Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session() 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.SessionStateTempDataProvider.SaveTempData(HttpContext context, IDictionary`2 values) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\SessionStateTempDataProvider.cs:line 57 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.TempDataDictionary.Save() in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\TempDataDictionary.cs:line 166 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.SaveTempData(IActionResult result, ITempDataDictionaryFactory factory, HttpContext httpContext) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 91 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.<>c.<OnResultExecuting>b__5_0(Object state) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 57 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.<FireOnStarting>d__178.MoveNext() 
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware: Error: An exception was thrown attempting to display the error page. 

System.ObjectDisposedException: The response has been aborted due to an unhandled application exception. ---> System.InvalidOperationException: Session has not been configured for this application or request. 
    at Microsoft.AspNetCore.Http.DefaultHttpContext.get_Session() 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.SessionStateTempDataProvider.SaveTempData(HttpContext context, IDictionary`2 values) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\SessionStateTempDataProvider.cs:line 57 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.TempDataDictionary.Save() in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\ViewFeatures\TempDataDictionary.cs:line 166 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.SaveTempData(IActionResult result, ITempDataDictionaryFactory factory, HttpContext httpContext) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 91 
    at Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.SaveTempDataFilter.<>c.<OnResultExecuting>b__5_0(Object state) in D:\temp\Mvc-dev\src\Microsoft.AspNetCore.Mvc.ViewFeatures\Internal\SaveTempDataFilter.cs:line 57 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.<FireOnStarting>d__178.MoveNext() 
    --- End of inner exception stack trace --- 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.ThrowResponseAbortedException() 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.<ProduceStartAndFireOnStartingAwaited>d__194.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.Frame.Write(ArraySegment`1 data) 
    at Microsoft.AspNetCore.Server.Kestrel.Internal.Http.FrameResponseStream.Write(Byte[] buffer, Int32 offset, Int32 count) 
    at System.IO.StreamWriter.Flush(Boolean flushStream, Boolean flushEncoder) 
    at System.IO.StreamWriter.Write(String value) 
    at Microsoft.Extensions.RazorViews.BaseView.Write(String value) 
    at Microsoft.AspNetCore.Diagnostics.RazorViews.ErrorPage.<ExecuteAsync>d__6.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.Extensions.RazorViews.BaseView.<ExecuteAsync>d__29.MoveNext() 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
    at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
    at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext() 
Microsoft.AspNetCore.Server.Kestrel: Error: Connection id "0HL1I8OFS17SU": An unhandled exception was thrown by the application. 
+0

Und was zeigt die Stack-Trace? –

+0

Strack Trace nicht gezeigt, es gibt Localhost nicht funktioniert Fehlercode 500 – Ahmar

+0

Protokollierung aktivieren, um die Stack-Trace zu sehen – Tratcher

Antwort

13

Endlich habe ich herausgefunden, was das Problem ist, nachdem ich in den Quellcode gegraben habe. Asp.Net Core MVC nicht unterstützt komplexen Datentyp für TempData derzeit. Es unterstützt nur string für jetzt. Es durch diese Ausnahme beim Serialisieren von Daten, wenn wir andere dann passieren string.

Die 'Microsoft.AspNetCore.Mvc.ViewFeatures.Internal.TempDataSerializer' kann ein Objekt des Typs 'MvcSandbox.Controllers.Alert' nicht serialisieren.

Ich serialisieren meine Liste zu JSON und speichern dann in TempData.

Hier ist, wie ich das gemacht habe. Ich erstelle eine Erweiterungsmethode zum Hinzufügen und Abrufen von Daten von 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); 
} 

hinzufügen Benachrichtigung es TempData

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

Schließlich bekommen 'TempData in View' und Anzeige.

@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> 
} 
2

Haben Sie Sitzung konfiguriert? TempData verwendet die Sitzung hinter den Kulissen.

Project.json

"Microsoft.AspNetCore.Session": "1.1.0" 

Hier ist die Startup.cs Datei. - ConfigureServices Methode

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

Und Configure Methode.

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

Jetzt versuchen Sie mit TempData, es wird funktionieren.

Und Sie können die Umgebung mit set ASPNETCORE_ENVIRONMENT=Development Umgebungsvariable einstellen.

+0

Ich habe alle diese Schritte bereits – Ahmar

+0

Noch haben Sie das Problem? Was ist der Stack-Trace? Wenn Sie über die Befehlszeile ausgeführt werden, welche Ausnahme erhalten Sie? – Anuraj

+0

@ Sami-Kuhmonen Stapelspur hinzugefügt. – Ahmar

0

Sie müssen auch .AddSessionStateTempDataProvider(), um Ihre services.AddMvc() hinzuzufügen.

services.AddMvc() 
    .AddSessionStateTempDataProvider(); 
Verwandte Themen