ASP Core Razor Pages изменить значение BindProperty при публикации - PullRequest
1 голос
/ 08 января 2020

Я создаю форму, используя одну страницу бритвы (я знаю, что это может быть не очень хорошая идея, но я пытаюсь сделать несколько [не очень] быстрых прототипов. По сути, первый шаг заключается в том, что пользователь вводит куча данных, и следующим шагом будет загрузка пользователем некоторых файлов. Моя модель страницы выглядит следующим образом:

public class CreateModel : PageModel
{
    private readonly DefaultDbContext _context;

    public CreateModel(DefaultDbContext context)
    {
        _context = context;
    }

    public async Task<IActionResult> OnGet(Guid id)
    {
        FileUpload = false;
        return Page();
    }

    [BindProperty]
    public bool FileUpload { get; set; } // Stored in a hidden field in my cshtml


    // To protect from overposting attacks, please enable the specific properties you want to bind to, for
    // more details see https://aka.ms/RazorPagesCRUD.
    public async Task<IActionResult> OnPostAsync()
    {
        FileUpload = true; // Hidden field is always false  
        return Page();
    }
}

Вот как выглядит моя форма:

<form method="post" enctype="multipart/form-data">
    <input type="hidden" asp-for="FileUpload" />

    @if (!Model.FileUpload)
    {
        // Do some stuff
    }
    else
    {
        <div class="form-group">
            <label asp-for="Upload" class="control-label"></label>
            <input type="file" asp-for="Upload" multiple />
            <span asp-validation-for="Upload" class="text-danger"></span>
        </div>
    }
    <div class="form-group">
        @if (Model.FileUpload)
        {
            <input type="submit" value="Finished" class="btn btn-primary" />
        }
        else
        {
            <input type="submit" value="Next" class="btn btn-primary" />
        }
    </div>
</form>

Когда я нажимаю «отправить» в первый раз, я ожидаю, что FileUpload будет true, что происходит при переходе по странице .cshtml в отладчике. Проблема заключается в том, что когда страница отправляется обратно в браузер, значение всегда ложно:

        <input type="hidden" data-val="true" data-val-required="The FileUpload field is required." id="FileUpload" name="FileUpload" value="False" />

Что я делаю не так?

1 Ответ

0 голосов
/ 16 января 2020

Необходимо учесть пару вещей:

  1. <input type="hidden"> элементы полезны только тогда, когда вы пытаетесь отправить информацию (содержащуюся в этих элементах) ОТ page TO модель , а не наоборот.
  2. [BindProperty] атрибут используется, когда вы пытаетесь сопоставить некоторую информацию FROM page TO свойство модели , а не наоборот:

    Привязка модели в Razor Pages - это процесс, который принимает значения из HTTP-запросов и сопоставляет их с [...] свойствами PageModel. Связывание модели

  3. В строке @if (Model.FileUpload) вы не извлекаете никакой информации из скрытого input элемента page , но от самой модели . Ваш код должен работать как есть (если вы игнорируете скрытый элемент input).

При этом вы можете полностью удалить скрытый input (и атрибут [BindProperty] , поскольку ничто не может быть связано с FileUpload после удаления input), и вам должно быть хорошо до go.

Однако, если вы сделаете wi sh, чтобы соответствующим образом изменить скрытое значение input, вы можете сделать это двумя способами:

  • Удалить [BindProperty] из FileUpload и оставьте все остальное таким же.
  • Сохраните [BindProperty], но измените измененное значение FileUpload:

    <input type="hidden" asp-for="FileUpload" value="@Model.FileUpload"/>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...