从实际操作名称获取视图名称而不是ActionNameAttribute?

时间:2017-09-05 19:17:03

标签: asp.net-core-mvc asp.net-core-mvc-2.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 Core 2.0中, IAsyncActionFilter 过滤器用于异步操作, context.Result 总是 null ,所以我无法更改通过它查看名称了。还有其他可能的方法吗?当然,我可以将视图名称传递给返回视图(),但这将是已知操作名称的冗余重复。

1 个答案:

答案 0 :(得分:0)

我发现 IActionFilter 可用于同步和异步操作:http://jakeydocs.readthedocs.io/en/latest/mvc/controllers/filters.html#action-filters

IActionFilter context.Result可用,所以现在我可以让ASP.NET Core 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)
    {
    }
}

如果有人建议采用更优雅的方式,我会很感激。