ASP Core Razor Pages如何在Post请求中更改BindProperty的值

3

我正在使用一个Razor页面创建一个表单(我知道这可能不是一个好主意,但我想进行一些[不是那么]快速的原型设计。基本上,第一步是用户输入一堆数据,下一步是用户将上传一些文件。我的页面模型看起来像这样:

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>

当我第一次点击提交时,我期望FileUploadtrue,当我在调试器中逐步执行.cshtml页面时,它确实是这样的。问题是,当页面发送回浏览器时,该值总是false
        <input type="hidden" data-val="true" data-val-required="The FileUpload field is required." id="FileUpload" name="FileUpload" value="False" />

我做错了什么?


你能展示一下表单的代码吗? - Mike Brind
我已经添加了我的表单代码。 - Zeus82
根据这个答案,在input中添加value="@Model.FileUpload"可以解决问题:<input asp-for="FileUpload" type="hidden" value="@Model.FileUpload"/>。至于为什么没有它就不起作用:我猜可能是因为没有这个值。 - PajLe
value="@Model.FileUpload" 没有起作用。我得到了相同的结果。 - Zeus82
1个回答

1
需要解决以下几个问题:
  1. <input type="hidden">元素仅在您尝试将信息(包含在这些元素中)从页面发送到模型时才有用,反之则无效。
  2. [BindProperty]属性用于在尝试将一些信息从页面映射到模型的属性时使用,反之则无效:

    在Razor Pages中进行模型绑定是一个过程,它将来自HTTP请求的值映射到PageModel属性。模型绑定

  3. 在行@if (Model.FileUpload)中,您并未从页面的隐藏input元素中提取任何信息,而是从模型本身中提取。如果忽略隐藏的input元素,则代码应该正常工作。

话虽如此,您可以完全删除隐藏的input(以及[BindProperty]属性,因为在删除input后无法绑定到FileUpload),然后您就可以开始使用了。

但是,如果您确实希望相应地更改隐藏的input值,则可以通过以下几种方式进行:

  • FileUpload中删除[BindProperty],并保持其他所有内容不变。
  • 保留[BindProperty],但呈现更改后的FileUpload值:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接