即时更改视图的路径
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请求)。以上是关于即时更改视图的路径的主要内容,如果未能解决你的问题,请参考以下文章