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

Ale*_*nko 5 c# asp.net-core razor-pages

ASP NET CORE 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");
    }
}
Run Code Online (Sandbox Code Playgroud)

当我尝试发布错误的图像时,!ModelState.IsValid yields true 和 Page() 调用。我得到 NullReferenceException: Object reference not set to an instance of an object.Model.ItemModel.Categories地方Categories是serveral的选择列表由_itemService.GetCreateViewModel从数据库正常下载()中的一个。我不明白发生了什么Page()。为什么不使用表单中的旧数据?如何asp-validation-for重新呈现带有验证错误的页面(我在 cshtml 中有)?我试过了this.ItemModel = itemModel,我不再得到 Null 引用,但没有看到任何验证错误,并且以前的选择列表值未保存。

Nko*_*osi 5

return Pagereturn View()在普通 MVC 控制器操作中调用相同。

当提交的表单有验证错误(传递给服务器)时,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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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