2017-09-05 56 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) 
    { 
    } 
} 

如果有人建议更优雅的方式,我将不胜感激。