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 引用,但没有看到任何验证错误,并且之前的选择列表值未保存。
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");
}
}