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

在這個例子中,ASP.NET Core將按名稱「new-post」查找一個視圖,但是我希望它通過實際名稱爲「NewPost」來查找。在ASP.NET MVC 5中,我使用篩選器將視圖名稱存儲在(filterContext.Result as ViewResultBase).ViewName中。在ASP.NET核心2.0 IAsyncActionFilter過濾器用於異步操作和上下文。結果始終是那裏,所以我不能再通過它更改視圖名稱。還有其他可行的方法嗎?當然,我可以將視圖名稱傳遞給return View(),但它會是已知操作名稱的冗餘重複。從不是來自ActionNameAttribute的實際操作名稱取得視圖名稱?

回答

0

我發現IActionFilter可同時用於synchronious和asynchronious操作:http://jakeydocs.readthedocs.io/en/latest/mvc/controllers/filters.html#action-filters

IActionFilter context.Result可所以現在我可以讓ASP.NET 2.0的核心採取實際行動這個名字方式:

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) 
    { 
    } 
} 

如果有人建議更優雅的方式,我將不勝感激。