I have a method to remove the object. Removal does not own view, and is a "Delete" button in the "EditReport". Upon successful removal of a redirect on "Report".
[HttpPost]
[Route("{reportId:int}")]
[ValidateAntiForgeryToken]
public IActionResult DeleteReport(int reportId)
{
var success = _reportService.DeleteReportControl(reportId);
if (success == false)
{
ModelState.AddModelError("Error", "Messages");
return RedirectToAction("EditReport");
}
ModelState.AddModelError("OK", "Messages");
return RedirectToAction("Report");
}
In ASP.NET MVC 5 I use the following attributes to save ModelState between methods. I took from here: https://stackoverflow.com/a/12024227/3878213
public class SetTempDataModelStateAttribute : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
base.OnActionExecuted(filterContext);
filterContext.Controller.TempData["ModelState"] =
filterContext.Controller.ViewData.ModelState;
}
}
public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
if (filterContext.Controller.TempData.ContainsKey("ModelState"))
{
filterContext.Controller.ViewData.ModelState.Merge(
(ModelStateDictionary)filterContext.Controller.TempData["ModelState"]);
}
}
}
But in ASP.NET MVC 6 RC 1 (ASP.NET Core 1.0), this code does not work.
Error in filterContext.Controller does not contain definitions for TempData and ViewData.
The fix to make the code compile is below, but it appears that ASP.NET Core does not support serializing the model state (due to
ModelStateEntry
containing exceptions which are never serializable).As such, you cannot serialize the model state in
TempData
. And as explained in this GitHub issue, there appear to be no plans to change this behavior.The
Controller
property inActionExecutingContext
is of typeobject
. This is because controllers in ASP.NET Core are not required to inherit fromController
, so there is no common base type for them.In order to access the
TempData
property, you have to cast it toController
first. Your attributes could look like this then:Thanks to answer, I realized that the need to create your own code ASP.NET Core 1.0 (Full .NET Framework 4.6.2)
Asynchronous version of the code ASP.NET Core 1.0 (Full .NET Framework 4.6.2)