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 类似于控制器中的操作如何返回ViewPageResult 是处理程序方法的默认返回类型。返回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 页面中调用 onPost

Razor View 将错误的 Id 传递给 OnPost 方法

在 Razor 页面中使用 OnPost 页面处理程序处理 AJAX 请求

如何在asp.net core razor pages 2.2中设置日期格式和文化

复选框单击 Razor 页面 AspNetCore 2.2 中的表单提交

IntelliSense 在 Razor Pages 项目中找不到 ViewComponent Invoke() 方法