【问题标题】:Taking a view name from a real action name not from ActionNameAttribute?从真实的动作名称而不是从 ActionNameAttribute 中获取视图名称?
【发布时间】:2017-09-05 19:17:02
【问题描述】:
[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 在那里,所以我不能改变不再通过它查看名称。还有其他可能的方法吗?当然,我可以将视图名称传递给 return View(),但这将是已知动作名称的冗余重复。

【问题讨论】:

    标签: asp.net-core-mvc asp.net-core-mvc-2.0


    【解决方案1】:

    我发现 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)
        {
        }
    }
    

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

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 1970-01-01
      • 2011-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-23
      相关资源
      最近更新 更多