【问题标题】:ASP Core Razor Pages Change BindProperty Value on PostASP Core Razor 页面在发布时更改 BindProperty 值
【发布时间】:2020-04-25 12:41:59
【问题描述】:

我正在使用一个剃须刀页面创建一个表单(我知道这可能不是一个好主意,但我正在尝试做一些 [不是那么] 快速原型设计。基本上,第一步是用户输入一个一堆数据,下一步就是用户上传一些文件。我的页面模型是这样的:

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" />

我做错了什么?

【问题讨论】:

  • 你能显示表单的代码吗?
  • 我已经为我的表单添加了代码。
  • 根据this answer,将value="@Model.FileUpload" 添加到input 可以解决问题:&lt;input asp-for="FileUpload" type="hidden" value="@Model.FileUpload"/&gt;。至于为什么没有它就不行:我猜它就是不行。
  • value="@Model.FileUpload" 不起作用。我得到了同样的结果。

标签: c# razor-pages asp.net-core-3.1


【解决方案1】:

有几点需要解决:

  1. &lt;input type="hidden"&gt; 元素仅在您尝试发送信息(包含在这些元素中)FROM 页面 TO 模型时有用,反之亦然。
  2. [BindProperty] 属性用于当您尝试映射某些信息FROM 页面 TO 模型属性,反之亦然:

    Razor 页面中的模型绑定是从 HTTP 请求获取值并将它们映射到 [...] PageModel 属性的过程。 Model Binding

  3. @if (Model.FileUpload) 行中,您不是从页面 的隐藏input 元素中提取任何信息,而是从模型 本身中提取任何信息。您的代码应该按原样运行(如果您忽略隐藏的 input 元素)。

话虽如此,您可以完全删除隐藏的input(以及[BindProperty] 属性,因为在删除input 后,没有任何东西可以绑定到FileUpload),您应该很高兴。

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

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

    &lt;input type="hidden" asp-for="FileUpload" value="@Model.FileUpload"/&gt;

【讨论】:

    猜你喜欢
    • 2023-03-31
    • 2018-07-30
    • 2019-02-18
    • 2018-09-28
    • 1970-01-01
    • 2019-09-21
    • 2020-05-26
    • 2020-12-21
    • 2019-12-20
    相关资源
    最近更新 更多