MVC.NET 在 ActionFilterAttribute 中获取完整视图路径

MVC.NET Get full view path in ActionFilterAttribute

提问人:Doe 提问时间:4/6/2018 更新时间:4/7/2018 访问量:707

问:

如何在 ActionFilterAttribute 中获取当前渲染视图的完整视图路径? 我找不到解决方案。

我只想在 OnActionExecuted 中做一些事情(自定义验证等),如果验证失败,我想显示带有验证错误的调用站点 - 这对我来说似乎很简单,但事实并非如此,因为我找不到最新呈现视图的完整路径......

到目前为止,它使用此代码在 OnActionExecuted 上工作,以获得硬编码视图。

filterContext.Result = new ViewResult() {
      ViewName = "~/Views/Login/Index.cshtml", // This is the path of the view with the calling form
      ViewData = new ViewDataDictionary(filterContext.Controller.ViewData) {
        Model = ApplicationFiler.GetViewModel(filterContext)
      }
    };

到目前为止,我以为我可以在上下文中获得最新渲染视图的完整路径,但我不能。如何获取实际呈现的完整路径?

然后我想,也许我可以在 OnActionExecuted 中执行操作后获取信息,暂时保存路径并稍后使用。 但是我仍然无法找到完整路径(我需要在上次执行操作时返回的视图的完整路径,没有任何错误)。

我真的必须临时保存执行的每个操作的完整路径吗?

ASP.NET-MVC 视图 路径 ActionFilterAttribute

评论

0赞 4/6/2018
不清楚你为什么想要它 - 你只需返回方法中的视图,如果无效以显示验证错误。ModelState
0赞 Doe 4/6/2018
我不想调用操作方法并在每个操作方法中检查 ModelState。我想在操作过滤器中全局检查它。

答:

1赞 CodeFuller 4/7/2018 #1

您可以通过以下方式从操作过滤器访问视图路径:

public override void OnResultExecuted(ResultExecutedContext filterContext)
{
    ViewResult viewResult = filterContext.Result as ViewResult;
    RazorView view = viewResult?.View as RazorView;
    string viewPath = view?.ViewPath;

    // ...
}

您应该准备好了,这不是控制器返回的唯一可能。控制器可以返回其他操作结果(例如 或 )。在这种情况下,显然无法在操作筛选器中访问任何视图。构造将返回 。ViewResultActionResultHttpNotFoundResultJsonResultfilterContext.Result as ViewResultnull