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

标签 c# asp.net-core razor-pages

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

最佳答案

return Page 与在正常的 MVC Controller 操作中调用 return View() 相同。

When the submitted form has validation errors (that are passed to the server), the OnPostAsync handler method calls the Page helper method. Page returns an instance of PageResult. Returning Page is similar to how actions in controllers return View. PageResult is the default return type for a handler method. A handler method that returns void renders the page.

更新页面模型属性以允许 View 绑定(bind)到模型。

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

关于c# - Razor Pages OnPost 方法中的 Page() 方法有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50567901/

相关文章:

c# - 如何在 C# 中创建一个完全透明的交互式 winform?

multithreading - asp.net core/kestrel 中的线程管理

c# - 授权需要类型为 Task<AuthenticationState> 的级联参数。考虑使用 CascadingAuthenticationState 来提供这个

c# - 使用 .NET Core Razor Pages 将文件下载到浏览器

asp.net-core - 如何在MVC核心(1.0.0)中读取xml文档?

javascript - ModelState.AddModelError 不在 asp.net.core RAZOR 页面中显示任何消息

javascript - 如何从 JavaScript 代码调用存储过程?

c# - 关于 Linq Query 中的 ArrayIndex

c# - 进程无法访问该文件,因为它正在被另一个进程在第二次调用时使用

asp.net-mvc - 如何让 .Net Core Action 返回 Nothing 或 Redirect