即时更改视图的路径

Posted

技术标签:

【中文标题】即时更改视图的路径【英文标题】:Change the view's path on the fly 【发布时间】:2013-06-13 09:05:02 【问题描述】:

我有这门课:

public abstract class MyController : Controller

  protected override void OnActionExecuting(ActionExecutingContext filterContext)
  
      string viewPath = filterContext/*... .ViewPath*/;
      viewPath = "Some new View Path";
  

我想检索并用另一个替换执行视图的路径。我试图在网络调用中调试查看过滤器上下文,但是我没有设法找到即将呈现的视图。

我该怎么做?

【问题讨论】:

【参考方案1】:

来自MSDN:

Controller.OnActionExecuting Method: 动作方法被调用之前调用。在这个阶段,ActionResult 不存在,因为Action 还没有执行。

你最好改用OnResultExecuting

protected override void OnResultExecuting(ResultExecutingContext filterContext)

    var viewResult = filterContext.Result as ViewResult;

    if (viewResult != null)
    
        var razorEngine = viewResult.ViewEngineCollection.OfType<RazorViewEngine>().Single();
        var viewName = !String.IsNullOrEmpty(viewResult.ViewName) ? viewResult.ViewName : filterContext.RouteData.Values["action"].ToString();
        var razorView = razorEngine.FindView(filterContext.Controller.ControllerContext, viewName, viewResult.MasterName, false).View as RazorView;
        var currentPath = razorView.ViewPath;
        var newPath = currentPath.Replace("..", "...");
        viewResult.View = new RazorView(filterContext.Controller.ControllerContext, newPath, razorView.LayoutPath, razorView.RunViewStartPages, razorView.ViewStartFileExtensions);
    

    base.OnResultExecuting(filterContext);

【讨论】:

视图名称是"Index""",而不是完整的视图路径。如何获得"~/Views/Controller/ViewName" 之类的字符串? 我相应地修改了我的答案。 viewResult.View 属性始终为空,即使视图名称最初是正确的。 我很抱歉这个问题,它本身不正确。在 OnResultExecuting 方法完成之前,MVC 无法知道确切的视图路径。 在 Asp.net MVC 中,请求 url 被映射(使用注册的路由)到 controller.action,然后该操作负责生成输出(即 ViewResult in我们的案例)。动作决定返回什么(或者它加载什么View文件)并不重要,它不应该影响url(除非它是明确的RedirectResult,这通常会导致另一个http请求)。

以上是关于即时更改视图的路径的主要内容,如果未能解决你的问题,请参考以下文章

即时更改 UI - iOS

从另一个线程更改视图[关闭]

更改 Rails 中的默认视图路径?

如何更改默认设计视图路径?

QML PathView:通过鼠标滚轮更改路径视图的当前索引

如何更改 Rails 3 控制器中视图文件的默认路径?