【问题标题】:ASP.NET MVC Checkbox resulting HTMLASP.NET MVC 复选框生成 HTML
【发布时间】:2018-04-17 05:13:11
【问题描述】:

我正在使用 html 复选框控件并将其与模型数据绑定,但是当我运行程序时,无论是否选中,我都看到 false 作为 checkbox 值传递。

在最后搜索谷歌时,我发现了一个代码 sn-p,它显示了如何使用 checkbox 和模型数据。

我的 HTML:

<input id="IsApproved" type="checkbox" value="true" name="IsApproved">
<input type="hidden" value="false" name="IsApproved">

我需要做什么来为具有相同名称的复选框创建一个隐藏字段,但复选框值我需要设置为 true,隐藏字段值我需要设置为 false。它工作,但我真的不明白它是如何工作的?

我只想知道当复选框是否被选中时,true 和 false 是如何传递给 action 方法的。

选中复选框时,复选框数据正在传递,但未选中时,隐藏字段数据正在传递....只是不了解该技术。我是MVC 的新手,我搜索谷歌以了解它是如何工作的,但没有找到任何结果。所以请有人告诉我true/false is passing 复选框是否被选中。

【问题讨论】:

  • 它只是确保您获得 IsApproved 的值。当您选中该框时,它会发送 IsApproved 的两个值.. [true, false].. 活页夹获取第一个值列表并将其分配给属性..如果没有隐藏输入,则不会将任何内容传递给您的 IsApproved 操作,并且 IsApproved 的值将为 null..
  • @Html.CheckBoxFor 非常简单,只要您不使用nullable&lt;bool&gt; dotnetfiddle.net/MAqhYq
  • 我来自网络表单背景,我们从不为每个复选框使用隐藏字段。当我们不使用隐藏字段时传递什么值?如果我们不使用隐藏字段,为什么正常的复选框值不会传递到服务器端?如果可能,请详细说明。
  • 如果没有隐藏字段并且您没有选中该复选框,则不会向服务器传递任何内容。

标签: asp.net-mvc checkbox


【解决方案1】:

在 HTML 表单中,复选框值仅在选中复选框时发送。在 ASP.NET MVC 中有一个辅助方法来呈现复选框:

@Html.CheckBoxFor(model => model.IsApproved)

如果IsApproved 类型为Booleanbool(相同),您将在生成的HTML 中看到:

<input name="IsApproved" type="checkbox" value="true" id="IsApproved">
<input name="IsApproved" type="hidden" value="false">

不过,IsApproved 也可以是可为空的布尔值 (bool?)。生成的 HTML 会有所不同:

<input name="IsApproved" type="checkbox" value="true" id="IsApproved">

如果是可为空的布尔值,您将看不到隐藏字段。这是因为在可为空属性的情况下不需要这些值。


也就是说,我建议您使用 HTML 助手而不是编写纯 HTML,除非您有一些特定的应用程序要求。

【讨论】:

  • 什么时候 IsApproved 可以为空布尔值,那么没有隐藏字段的复选框是否有效?
  • 很少有人使用@Html.CheckBoxFor,很少有人使用@Html.EditFor 来渲染复选框。你知道哪一个最好吗? @Html.EditFor 可以达到什么特殊目的?请分享知识。谢谢
  • 如果是单选按钮,那么我们需要使用隐藏字段吗?请回答我的3个问题。谢谢
  • 隐藏字段用于确保 something 已发布。默认情况下,复选框仅在选中时发布其值。因此,在不可为空的 bool 的情况下,未选中的复选框将发布 null,不能将其分配给 bool。但是,对于可为空的布尔值,该行为正是您想要的,这就是隐藏字段被删除的原因。
  • 收音机不同,因为传统上,必须选择一个值,这意味着总是发布一些内容。 CheckBoxForEditorFor 之间的区别在于 CheckBoxFor 将始终呈现相同的 HTML 位,而 EditorFor 将使用适当的编辑器模板(如果可用)。
【解决方案2】:

所以这里有复选框:如果它们被选中,它们只会在 HTML 请求中传递。因此,我实际上建议您使用两个单选按钮来执行您正在尝试做的事情(在风格上是正确的)。

您绝对可以为此使用复选框,但这并不意味着您应该这样做,而且我认为您经常会遇到麻烦。当有一个用户可以从中选择 0 个或更多的项目列表时,我更喜欢使用它们——比如某人想要注册的邮件列表(零个或多个:无、营销、销售等)。当您有两个或多个互斥选项时,单选按钮最适合。此外,对于单选按钮,某些内容总是随请求一起传递。那么让我们开始吧:

<form action="">
    <input type="radio" name="IsApproved" value="true">Approved <br />
    <input type="radio" name="IsApproved" value="false">Unapproved
</form>

然后,您想转到您的操作方法:

[HttpPost]
public ActionResult MyPostAction(bool IsApproved)
{
    /*your logic here */
}

所以当用户提交表单时,IsApproved 将绑定到 bool 变量,您不必担心复选框是否被选中,或者处理隐藏字段。如果 bool 是模型中的属性,它将自动绑定到该属性:

public class User 
{
    public int UserID {get; set;}
    public string Name {get;set;}
    public bool IsApproved {get;set;}
}

以及动作方法:

[HttpPost]
public ActionResult MyPostAction(User user)
{
    /*your logic here */
}

编辑

好的,所以我快速阅读了这个问题,并没有意识到您对这些东西的工作原理更感兴趣,而不是在寻找实现。当用户向 MVC 框架提交请求并且接收操作中有参数时,模型绑定器会获取原始请求并尝试将其映射到操作方法参数中指定的对象.所有类型的 Web 控件(复选框、单选框、文本框等)都有默认实现。 Check out this page for more information.

【讨论】:

  • 我不确定 1 和 0 是否是传递给 bool 的正确值。我相信值属性应该是真假
  • 我对复选框进行了咆哮,因为我认为它不是您选择的技术的最佳选择。话虽如此,我意识到您正在寻找有关模型活页夹的信息,并为您提供了一个链接以查看其工作原理。
猜你喜欢
  • 1970-01-01
  • 2011-01-05
  • 2011-08-03
  • 1970-01-01
  • 2013-08-05
  • 2011-05-16
  • 2013-02-15
  • 2011-02-19
  • 2010-11-01
相关资源
最近更新 更多