Mam metodę usuwania obiektu. Usunięcie nie jest właścicielem widoku i jest przyciskiem "Usuń" w "EditReport". Po pomyślnym usunięciu przekierowania w "Raporcie".Jak nadal używać ModelState z RedirectToAction w ASP.NET MVC 6?
[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");
}
W środowisku ASP.NET MVC 5 używam następujących atrybutów do zapisania parametru ModelState między metodami. Wziąłem stąd: 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"]);
}
}
}
Ale w ASP.NET MVC 6 RC 1 (podstawowa ASP.NET 1.0), ten kod nie działa.
Błąd w filterContext.Controller nie zawiera definicji dla TempData i ViewData.
Należy sprawdzić, czy nie pojawiają się błędy w linii 'SetTempDataModelStateAttribute' var listError = modelState.ToDictionary (m => m.Key, m => m.Value.Errors' powinno być 'modelState.Where (x => x.Value.Errors.Any()). ToDictionary (m ...' –
Użycie 'czekaj na następny() ; 'jest tutaj niepoprawne, ponieważ powoduje, że metoda jest wielokrotnie trafiana. –