Razor Pages OnPost 方法中的 Page() 方法有啥作用?
Posted
技术标签:
【中文标题】Razor Pages OnPost 方法中的 Page() 方法有啥作用?【英文标题】:What does Page() method in Razor Pages OnPost method do?Razor Pages OnPost 方法中的 Page() 方法有什么作用? 【发布时间】:2018-11-07 03:18:23 【问题描述】:ASP NET 核心 2 我有以下页面模型代码
public class CreateModel : PageModel
private readonly IItemService _itemService;
public ItemCreateViewModel ItemModel get; set;
public CreateModel(IItemService itemService)
_itemService = itemService;
// all related data downloaded from db, so all rendered correctly
public async Task OnGet(ItemCreateViewModel itemModel)
ItemModel = await _itemService.GetCreateViewModel();
public async Task<IActionResult> OnPost(ItemCreateViewModel itemModel)
if (!ModelState.IsValid)
return Page();
var item = _itemService.CreateItem(itemModel);
var image = await ImagesController.ProcessFormImage(itemModel.ImageUpload.UploadPhoto, item.Id, ModelState);
if (!ModelState.IsValid)
//trouble is somewhere here
return Page();
await _itemService.SaveItemImage(image);
_itemService.CreateItem(itemModel);
return RedirectToPage("./Index");
当我尝试发布错误的图片时,!ModelState.IsValid 会返回 true 并调用 Page()。我明白了
NullReferenceException: Object reference not set to an instance of an object.
in Model.ItemModel.Categories
其中Categories
是通常由_itemService.GetCreateViewModel() 从db 下载的多个选择列表之一。
我不明白Page()
会发生什么。为什么不使用表单中的旧数据?如何重新呈现出现验证错误的页面(我在 cshtml 中有 asp-validation-for
)?我尝试了this.ItemModel = itemModel
,但我不再获得 Null 引用,但没有看到任何验证错误,并且之前的选择列出了未保存的值。
【问题讨论】:
和普通MVC中返回View()
一样
我相信语义类似于您之前在控制器中所做的。
【参考方案1】:
return Page
与在普通 MVC 控制器操作中调用 return View()
相同。
当提交的表单有验证错误(传递给服务器)时,
OnPostAsync
处理程序方法调用Page
帮助程序方法。Page
返回PageResult
的实例。返回Page
类似于控制器中的操作如何返回View
。PageResult
是处理程序方法的默认返回类型。返回void
的处理程序方法呈现页面。
更新页面模型属性以允许视图绑定到模型。
public class CreateModel : PageModel
private readonly IItemService _itemService;
public CreateModel(IItemService itemService)
_itemService = itemService;
[BindProperty]
public ItemCreateViewModel ItemModel get; set;
// all related data downloaded from db, so all rendered correctly
public async Task<IActionResult> OnGetAsync()
ItemModel = await _itemService.GetCreateViewModel();
return Page();
public async Task<IActionResult> OnPostAsync()
if (!ModelState.IsValid)
return Page();
var item = _itemService.CreateItem(ItemModel);
var image = await ImagesController.ProcessFormImage(ItemModel.ImageUpload.UploadPhoto, item.Id, ModelState);
if (!ModelState.IsValid)
return Page();
await _itemService.SaveItemImage(image);
_itemService.CreateItem(ItemModel);
return RedirectToPage("./Index");
参考Introduction to Razor Pages in ASP.NET Core
【讨论】:
我终于明白了发生了什么。我必须正确阅读基础知识。谢谢。以上是关于Razor Pages OnPost 方法中的 Page() 方法有啥作用?的主要内容,如果未能解决你的问题,请参考以下文章
Razor View 将错误的 Id 传递给 OnPost 方法
在 Razor 页面中使用 OnPost 页面处理程序处理 AJAX 请求
如何在asp.net core razor pages 2.2中设置日期格式和文化