Что делает метод Page () в методе Razor Pages OnPost? - PullRequest
0 голосов
/ 28 мая 2018

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");
    }
}

Когда я пытаюсь опубликовать неправильное изображение,! ModelState.IsValid возвращает true и вызывается Page ().Я получаю NullReferenceException: Object reference not set to an instance of an object. в Model.ItemModel.Categories, где Categories - это один из нескольких списков выбора, обычно загружаемых из базы данных _itemService.GetCreateViewModel ().Я не понимаю, что происходит на Page().Почему не используются старые данные из формы?Как я могу перерисовать страницу с ошибками проверки (у меня asp-validation-for в cshtml)?Я попытался this.ItemModel = itemModel, и я больше не получаю нулевую ссылку, но не вижу ошибок валидации, а предыдущие списки выбора не сохранили значения.

1 Ответ

0 голосов
/ 28 мая 2018

return Page аналогично вызову return View() в обычном действии контроллера MVC.

Если в отправленной форме есть ошибки проверки (которые передаются на сервер), 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");
    }
}

Ссылка Введениеочистить страницы в ASP.NET Core

...