Razor Pages OnPost 方法中的 Page() 方法有什么作用?

问题描述 投票:0回答:1

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.
Model.ItemModel.Categories
中,其中
Categories
是通常由 _itemService.GetCreateViewModel() 从数据库下载的几个选择列表之一。 我不明白
Page()
发生了什么。为什么不使用表单中的旧数据?如何重新渲染带有验证错误的页面(我在 cshtml 中有
asp-validation-for
)?我尝试了
this.ItemModel = itemModel
,并且不再获得 Null 引用,但没有看到任何验证错误,并且之前的选择列表值未保存。

c# asp.net-core razor-pages
1个回答
7
投票

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");
    }
}

参考ASP.NET Core 中的 Razor 页面简介

© www.soinside.com 2019 - 2024. All rights reserved.