[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 ,所以我无法更改通过它查看名称了。还有其他可能的方法吗?当然,我可以将视图名称传递给返回视图(),但这将是已知操作名称的冗余重复。
答案 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)
{
}
}
如果有人建议采用更优雅的方式,我会很感激。