オブジェクトを削除する方法があります。削除はビューを所有しておらず、 "EditReport"内の "Delete"ボタンです。 「レポート」のリダイレクトが正常に削除されました。ASP.NETコア1.0でModelStateとRedirectToActionを使用した非同期
ASP.NET Core 1.0(Full .NET Framework)では、次の属性を使用してメソッド間にModelStateを保存します。私はここから取った:https://stackoverflow.com/a/35987804/3878213
私は最近、コントローラ、サービス、およびリポジトリの非同期メソッドの使用に切り替えました。 アクションの属性も非同期である必要があります。 当初、私は次のようにコードの属性を書き直し:
public class SetTempDataModelStateAttribute : Attribute, IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext filterContext, ActionExecutionDelegate next)
{
var controller = filterContext.Controller as Controller;
var modelState = controller?.ViewData.ModelState;
if (modelState != null)
{
var listError = modelState.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 : Attribute, IAsyncActionFilter
{
public async Task OnActionExecutionAsync(ActionExecutingContext filterContext, ActionExecutionDelegate 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<Dictionary<string, string>>(modelStateString));
var modelState = new ModelStateDictionary();
foreach (var item in listError)
{
modelState.AddModelError(item.Key, item.Value ?? "");
}
controller.ViewData.ModelState.Merge(modelState);
}
}
await next();
}
}
は、それは私には論理的に思えました。しかし、このコードは私が期待した通りに動作しません。 しかし、非同期の属性を以下では正常に動作している:
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.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<Dictionary<string, string>>(modelStateString));
var modelState = new ModelStateDictionary();
foreach (var item in listError)
{
modelState.AddModelError(item.Key, item.Value ?? "");
}
controller.ViewData.ModelState.Merge(modelState);
}
}
await next();
}
}
二つのオプションのどちらがより正しい教えてください?そして、なぜ最初のオプションが機能しないのですか?
'await next();'を使用すると、そのメソッドが複数回ヒットするため、ここでは間違っています。 –