asp.net core razor 页面复选框模型绑定(始终为 false)

Posted

技术标签:

【中文标题】asp.net core razor 页面复选框模型绑定(始终为 false)【英文标题】:asp.net core razor page checkboxes model binding (always false) 【发布时间】:2020-09-06 21:08:52 【问题描述】:

我在 asp.net core 中有一个带有以下输入标签的剃须刀页面:

<input asp-for="chkPref" />

在我的代码隐藏中:

public bool chkPref  get; set; 

所以当我运行该应用程序时,我可以在Request.Form 中确认我正在...

复选框选中 = true,false

复选框未选中 = false

这是预期的,根据https://www.learnrazorpages.com/razor-pages/forms/checkboxes(这似乎是每个人都指向这个问题的答案的网站)

但是,该页面指出模型绑定会发现 true,false 实际上是 true 但无论如何我都会得到 false

上面的网站暗示了这种“刚刚发生”的事实......

如果复选框被选中,发布的值将为真,假。这 模型绑定器将从值中正确提取 true。否则它 会是假的。

但这似乎不起作用,或者至少它的工作原理并不那么明显。

首先我不确定如何将两个值(即 - truefalse)分配给单个 bool

我什至尝试将其变成List&lt;bool&gt;,但这也没有用。这会引发一组完全不同的错误。

【问题讨论】:

【参考方案1】:

我相信查看Request.Form 可以为您提供原始表单数据。您可能想要的是利用表单活页夹:

您可以使用BindPropertyAttribute 标记属性,或者表明您希望这些特定属性作为OnPost 处理程序的参数(参见下面的示例)。

给定一个剃须刀页面

<form method="post">
    <input asp-for="chkPref" />
    @html.CheckBoxFor(model => model.chkPref2)
    <button>Click</button>
</form>

您的代码隐藏可能如下所示:

public class IndexModel : PageModel

    public bool chkPref  get; set;  // will not get bound

    [BindProperty] // Binder needs to know which properties to work with
    public bool chkPref2  get; set; 

    public void OnPost(bool chkPref)// PageActionInvoker will pass correct value as parameter
    
        this.chkPref = chkPref;
    

【讨论】:

您回答的关键是添加缺少的[BindProperty]。谢谢!

以上是关于asp.net core razor 页面复选框模型绑定(始终为 false)的主要内容,如果未能解决你的问题,请参考以下文章

覆盖 asp.net core razor 页面中的 razor 视图

ASP.NET Core 2.1 Razor 页面返回带有模型的页面

ASP .NET Core Razor 页面中的授权

Asp.net core razor pages 加载部分页面

ASP.NET Core Razor 页面与完整 MVC Core [关闭]

Asp .NET Core 2.2 Razor 页面布局和局部