如何在ASP.NET MVC 6中继续使用ModelState和RedirectToAction?
我有一个删除对象的方法。 删除不属于视图,并且是“EditReport”中的“删除”按钮。 成功删除“报告”上的重定向后。
[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"); }
在ASP.NET MVC 5中,我使用以下属性在方法之间保存ModelState。 我从这里开始: 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"]); } } }
但是在ASP.NET MVC 6 RC 1(ASP.NET Core 1.0)中,此代码不起作用。
filterContext.Controller中的错误不包含TempData和ViewData的定义。
感谢回答 ,我意识到需要创建自己的代码ASP.NET Core 1.0(完整的.NET Framework 4.6.2)
public class SetTempDataModelStateAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); var controller = filterContext.Controller as Controller; var modelState = controller?.ViewData.ModelState; if (modelState != null) { var listError = modelState.Where(x => x.Value.Errors.Any()) .ToDictionary(m => m.Key, m => m.Value.Errors .Select(s => s.ErrorMessage) .FirstOrDefault(s => s != null)); controller.TempData["ModelState"] = JsonConvert.SerializeObject(listError); } } } public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); var controller = filterContext.Controller as Controller; var tempData = controller?.TempData?.Keys; if (controller != null && tempData != null) { if (tempData.Contains("ModelState")) { var modelStateString = controller.TempData["ModelState"].ToString(); var listError = JsonConvert.DeserializeObject>(modelStateString); var modelState = new ModelStateDictionary(); foreach (var item in listError) { modelState.AddModelError(item.Key, item.Value ?? ""); } controller.ViewData.ModelState.Merge(modelState); } } } }
代码的非同步版本ASP.NET Core 1.0(完整的.NET Framework 4.6.2)
public class SetTempDataModelStateAttribute : ActionFilterAttribute { public override async Task OnActionExecutionAsync(ActionExecutingContext filterContext, ActionExecutionDelegate next) { await base.OnActionExecutionAsync(filterContext, next); var controller = filterContext.Controller as Controller; var modelState = controller?.ViewData.ModelState; if (modelState != null) { var listError = modelState.Where(x => x.Value.Errors.Any()) .ToDictionary(m => m.Key, m => m.Value.Errors .Select(s => s.ErrorMessage) .FirstOrDefault(s => s != null)); var listErrorJson = await Task.Run(() => JsonConvert.SerializeObject(listError)); controller.TempData["ModelState"] = listErrorJson; } await next(); } } public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute { public override async Task OnActionExecutionAsync(ActionExecutingContext filterContext, ActionExecutionDelegate next) { await base.OnActionExecutionAsync(filterContext, next); var controller = filterContext.Controller as Controller; var tempData = controller?.TempData?.Keys; if (controller != null && tempData != null) { if (tempData.Contains("ModelState")) { var modelStateString = controller.TempData["ModelState"].ToString(); var listError = await Task.Run(() => JsonConvert.DeserializeObject>(modelStateString)); var modelState = new ModelStateDictionary(); foreach (var item in listError) { modelState.AddModelError(item.Key, item.Value ?? ""); } controller.ViewData.ModelState.Merge(modelState); } } await next(); } }
编译代码的修复程序如下所示,但似乎ASP.NET Core不支持序列化模型状态(由于ModelStateEntry
包含永远不可序列化的exception)。
因此,您无法在TempData
序列化模型状态。 正如本GitHub问题所解释的那样,似乎没有计划改变这种行为。
ActionExecutingContext
的Controller
属性是object
类型。 这是因为ASP.NET Core中的Controller
不需要从Controller
inheritance,因此它们没有共同的基类型。
要访问TempData
属性,必须TempData
其TempData
为Controller
。 您的属性可能如下所示:
上述就是C#学习教程:如何在ASP.NET MVC 6中继续使用ModelState和RedirectToAction?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
public class SetTempDataModelStateAttribute : ActionFilterAttribute { public override void OnActionExecuted(ActionExecutedContext filterContext) { base.OnActionExecuted(filterContext); Controller controller = filterContext.Controller as Controller; if (controller != null) { controller.TempData["ModelState"] = controller.ViewData.ModelState; } } } public class RestoreModelStateFromTempDataAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext filterContext) { base.OnActionExecuting(filterContext); Controller controller = filterContext.Controller as Controller; if (controller != null & controller.TempData.ContainsKey("ModelState")) { controller.ViewData.ModelState.Merge( (ModelStateDictionary)controller.TempData["ModelState"]); } } }
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/954001.html