2

オブジェクトを削除する方法があります。削除はビューを所有しておらず、 "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(); 
     } 
    } 

二つのオプションのどちらがより正しい教えてください?そして、なぜ最初のオプションが機能しないのですか?

+0

'await next();'を使用すると、そのメソッドが複数回ヒットするため、ここでは間違っています。 –

答えて

2

どちらのオプションが正しいかお教えください。

オプション2は実際には機能するため、より正確です。気づいたとおりです。あなたがそれを継承するつもりがなければ、それはsealedになりました。この状況でActionFilterAttributeを使用するのが適切なようです。実際にはquick look @ the repoは、これが実際には非常に一般的なアプローチであることを示しています。

なぜ最初のオプションは機能しませんか?

呼び出しはbase呼び出しを呼び出していません。鍵は、カスタム実装では欠けている可能性があるコードがbaseにあることです。それをチェックしてくださいhere

関連する問題