从ASP.NET MVC迁移到Razor Pages:如何无重定向返回其他页面?
我明白你现在的迁移需求——要把MVC里那种直接指定其他视图并传模型的逻辑搬到Razor Pages里,而且不能用重定向、不能让目标页面执行自身的On方法,完全就是服务器端直接换模板渲染。其实这个需求在Razor Pages里是可以实现的,而且思路和MVC的逻辑很接近,只是写法上要调整一下。
核心解决方案:直接渲染目标页面的视图文件
Razor Pages的.cshtml文件本质上和MVC的视图是一样的,所以我们可以跳过Razor Pages的路由处理逻辑,直接把目标页面的.cshtml当作普通视图来渲染,同时传递你准备好的PageModel。具体代码如下:
在你当前的PageModel处理方法(比如OnGet或OnPost)里:
public IActionResult OnGet() { // 1. 准备好目标页面需要的PageModel实例,填充数据 var targetPageModel = new TargetPageModel(); targetPageModel.YourProperty = "你要传递的数据"; targetPageModel.AnotherProperty = GetSomeData(); // 2. 直接返回ViewResult,指定目标页面的绝对路径 // 路径格式:/Pages/目标页面名称.cshtml(如果页面在根Pages目录下) // 如果在Area里,路径是 /Areas/Area名称/Pages/目标页面名称.cshtml return View("/Pages/TargetPage.cshtml", targetPageModel); }
关键细节说明
为什么不会触发目标页面的On方法?
因为我们是直接调用View()方法渲染目标页面的.cshtml文件,没有通过Razor Pages的路由系统去触发目标PageModel的OnGet/OnPost等处理方法,相当于把它当成了一个无后端逻辑的纯视图模板来用,完全符合你“仅渲染HTML”的要求。路径注意事项
必须使用绝对路径(以/开头),否则框架会找不到对应的视图文件。比如你的目标页面在Pages/Orders/Detail.cshtml,那路径就要写/Pages/Orders/Detail.cshtml。目标页面的模型绑定
确保目标页面的@model指令和你传递的PageModel类型一致,比如目标页面顶部要写:@model YourNamespace.TargetPageModel这样视图才能正确读取你传递的模型数据。
进阶:封装成扩展方法(可选)
如果你在多个地方需要用到这个逻辑,可以封装一个扩展方法让代码更简洁:
public static class PageModelExtensions { public static IActionResult RenderOtherPage(this PageModel sourcePage, string targetPagePath, object model) { return sourcePage.View(targetPagePath, model); } }
之后在PageModel里就可以这样调用:
return this.RenderOtherPage("/Pages/TargetPage.cshtml", targetPageModel);
这种方式完全对应MVC里return View("someOtherView", someModelForOtherView)的行为,没有浏览器往返、不需要重定向,完美满足你的迁移需求。
内容的提问来源于stack exchange,提问作者Sebastian P.R. Gingter

