ASP.NET MVC 3 实现 Server.Transfer 效果

需积分: 9 3 下载量 76 浏览量 更新于2024-09-21 收藏 293KB PDF 举报
"ASP.NET MVC 3实现类似于Server.Transfer的效果" 在ASP.NET Web Forms中,`Server.Transfer`方法被广泛用于服务器端的页面跳转,它可以在不刷新浏览器的情况下,将执行流程转移到另一个页面,同时保留请求状态。然而,ASP.NET MVC框架默认并未提供与`Server.Transfer`完全相同的功能。在MVC模式下,我们通常使用`Redirect`, `RedirectToAction`或`RedirectToRoute`来实现页面跳转,这些方法基于HTTP GET请求,对于传递大量数据或复杂对象时可能存在局限。 为了在ASP.NET MVC 3中实现类似于`Server.Transfer`的效果,我们可以利用MVC的灵活性,通过动态改变Action渲染的视图(View)路径来达到目的。以下是实现这个功能的两个关键步骤: 1. 创建自定义ViewEngine: 首先,我们需要创建一个继承自`RazorViewEngine`的自定义视图引擎。在这个例子中,我们将创建一个名为`ChangeViewEngine`的类,它接受两个参数,一个是控制器(Controller)路径名称,另一个是视图(View)名称。然后,我们重写`ViewLocationFormats`属性,使其只查找指定的控制器路径和视图名称。 ```csharp public class ChangeViewEngine : RazorViewEngine { public ChangeViewEngine(string controllerPathName, string viewName) { this.ViewLocationFormats = new[] { "~/Views/" + controllerPathName + "/" + viewName + ".cshtml" }; } } ``` 2. 实现ActionAttribute: 接下来,创建一个自定义的`ActionFilterAttribute`,名为`ChangeViewPathAttribute`。这个过滤器将在Action执行后,改变当前视图的路径。在过滤器的`OnActionExecuted`方法中,我们可以根据需要设置视图引擎并找到正确的视图进行渲染。 ```csharp [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class)] public class ChangeViewPathAttribute : ActionFilterAttribute { private readonly string _controllerPathName; private readonly string _viewName; public ChangeViewPathAttribute(string controllerPathName, string viewName) { _controllerPathName = controllerPathName; _viewName = viewName; } public override void OnActionExecuted(ActionExecutedContext filterContext) { var controllerContext = filterContext.Controller.ControllerContext; var viewResult = filterContext.Result as ViewResult; if (viewResult != null) { var oldViewEngine = controllerContext.RouteData.DataTokens["ViewEngineKey"] as IViewEngine; var newViewEngine = new ChangeViewEngine(_controllerPathName, _viewName); // 将旧的视图引擎替换为新的自定义视图引擎 controllerContext.RouteData.DataTokens["ViewEngineKey"] = newViewEngine; // 重新查找视图 viewResult.ViewEngineCollection.Clear(); viewResult.ViewEngineCollection.Add(newViewEngine); viewResult.View = viewResult.FindView(controllerContext); } } } ``` 现在,你可以将`ChangeViewPathAttribute`应用于你的Action或Controller,传入相应的控制器路径和视图名称。这样,当Action执行完毕后,MVC框架会按照自定义的视图引擎来查找并渲染视图,从而实现类似`Server.Transfer`的效果,即地址栏URL不变,且能够传递大量的数据或对象。 这样的实现方式虽然不能完全复刻`Server.Transfer`的所有特性,比如它无法直接传递服务器端的对象,但确实能够在不刷新页面的情况下改变页面内容,减少客户端与服务器的交互。这在某些场景下,尤其是需要优化性能或处理大数据量参数时,是非常有用的。