【问题标题】: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()一样
  • 我相信语义类似于您之前在控制器中所做的。

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


【解决方案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

【讨论】:

  • 我终于明白了发生了什么。我必须正确阅读基础知识。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-04-01
  • 2021-12-15
  • 1970-01-01
  • 2021-07-27
  • 2011-07-10
  • 2018-04-16
  • 2021-10-09
  • 2021-06-17
相关资源
最近更新 更多