2017-09-05 10 views
0
[ActionName("new-post")] 
public async Task<IActionResult> NewPost() 
{ 
    return View(); 
} 

この例では、ASP.NET Coreは「new-post」という名前でビューを検索しますが、実際のアクション名である「NewPost」を検索します。 ASP.NET MVC 5では、ビューの名前が(viewResultBaseとしてfilterContext.Result)に格納されたフィルタを使用していました.ViewName。 ASP.NETコア2.0 IAsyncActionFilterフィルタは非同期アクションに使用され、コンテキストです。結果は常にnullです。このため、ビュー名を変更することはできません。それを行う他の方法がありますか?もちろん、ビュー名をに返すことができます。戻り値View()しかし、それはすでに知られているアクション名の重複したコピーになります。ActionNameAttributeからではなく、実際のアクション名からビュー名を取得していますか?

答えて

0

私はIActionFilterがsynchroniousとasynchronious両方のアクションのために使用することができることを見出した。IActionFilter context.Resultでhttp://jakeydocs.readthedocs.io/en/latest/mvc/controllers/filters.html#action-filters

は今、私はASP.NETコア2.0は、この実際のアクション名を取ることができます提供されていますway:

public class SetActionViewNameFromActionNameAttributeFilter : IActionFilter 
{ 
    public void OnActionExecuted(ActionExecutedContext context) 
    { 
     var result = context.Result as ViewResult; 

     if (result != null) 
     { 
      var controllerActionDescriptor = (ControllerActionDescriptor)context.ActionDescriptor; 
      var actionNameAttr = controllerActionDescriptor.MethodInfo.TryGetAttribute<ActionNameAttribute>(); 

      bool changeViewName = actionNameAttr != null && (result.ViewName == null || result.ViewName == actionNameAttr.Name); 

      if (changeViewName) 
       result.ViewName = controllerActionDescriptor.MethodInfo.Name; 
     } 
    } 

    public void OnActionExecuting(ActionExecutingContext context) 
    { 
    } 
} 

誰かがもっとエレガントな方法を提案したら、私はそれを感謝します。

関連する問題