我正在将一个 Asp.Net MVC 应用程序移植到 Razor Pages。
在 MVC 应用程序的一些控制器中,它使用 return View("someOtherView", someModelForOtherView);
如何将其移植到 Razor Pages?我需要做的是将请求转移到另一个 Razor 页面并将准备好的 PageModel 传递给它(另一个页面不需要执行OnMethod(),只需呈现其 html。或者,换句话说,我只需要交换模板应该与另一个文件一起呈现的文件。
我无法使用,Redirect因为不能通过浏览器进行另一次往返。
我怀疑这是(很容易)可能的。从上面 Lerner 链接的github 请求中可以看出,Razor Pages 并不是为这样做而设计的。
我能够实现的最接近的解决方法是将我的目标 Razor 页面转换为视图。(因此,没有代码隐藏。)显然,只有当您的目标页面从未通过 URL 直接访问时才有可能。例如,如果您想重定向到/Pages/MyPage,并且您仍然需要能够访问 url http://example.com/MyPage,这将不起作用。
但是,假设您想要的只是一个通用错误或状态页面。这些不必通过 URL 直接访问。这对此很有效。
这里有几种扩展方法PageModel可以做到这一点,一种接受模型,另一种不接受:
public static ViewResult View(this PageModel pageModel, string viewName) {
return new ViewResult() {
ViewName = viewName,
ViewData = pageModel.ViewData,
TempData = pageModel.TempData
};
}
public static ViewResult View<TModel>(this PageModel pageModel, string viewName, TModel model) {
var viewDataDictionary = new ViewDataDictionary<TModel>(new EmptyModelMetadataProvider(), new ModelStateDictionary()) {
Model = model
};
foreach (var kvp in pageModel.ViewData) viewDataDictionary.Add(kvp);
return new ViewResult {
ViewName = viewName,
ViewData = viewDataDictionary,
TempData = pageModel.TempData
};
}
Run Code Online (Sandbox Code Playgroud)
仅供参考,必须重新创建视图字典的原因是因为您的视图字典pageModel将具有特定于当前页面的模型类型,而不是您指向的视图,并且您无法更改模型ViewDataDictionary 到不同的类型。MVC 会抱怨并抛出异常。
用法:
public IActionResult OnGet(string id) {
// check if id is good here
if (idIsNoGood) return this.View("InvalidId", new ErrorModel...);
else {
return Page();
}
}
Run Code Online (Sandbox Code Playgroud)
以上将寻找InvalidId.cshtml视图,它可以与您的页面、根/Pages/文件夹或/Pages/Shared/. 它仍然会使用您的布局,就像任何其他页面一样。
只需确保您的 cshtml 文件@page顶部没有指令;这不适用于 Razor 页面,仅适用于视图。
示例 InvalidId.cshtml:
@model MyProject.Models.ErrorModel
<h1>Invalid Request</h1>
<p>@Model.Message</p>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2214 次 |
| 最近记录: |