【发布时间】: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