【问题标题】:Asp.Net Mvc 2 Checkbox always false in modelAsp.Net Mvc 2 复选框在模型中始终为假
【发布时间】:2016-05-10 20:04:50
【问题描述】:

我有一个这样的复选框:

<%= Html.CheckBoxFor(x => x.IsSendingQualitySurvey) %>/>

选中复选框并提交时,我得到典型的 2 个表单值:

IsSendingQualitySurvey: true
IsSendingQualitySurvey: false

这对于 mvc modelbinder 处理复选框的方式完全有效。

然后在控制器动作中:

[HttpPost]
public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel)

ticketEditViewModel.IsSendingQualitySurvey(一个普通的布尔值)总是假的。

我没有任何自定义模型绑定器,它可以在其他地方使用。 奇怪的是,很久以前我在另一个视图中遇到了同样的问题,我不得不手动创建输入,看起来像这样:

<input type="checkbox" value="true" name="<%=Html.NameFor(x => x.IsRequestingVisit) %>" id="<%=Html.NameFor(x => x.IsRequestingVisit) %>" />

这行得通,但是当我将完全相同的内容复制到另一个视图时,该值仍然始终为 false。

问题在哪里?

谢谢。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    EDIT 搞错了...对不起

    您是否尝试过像这样从帖子数据中提取原始值:

    在控制器中:

    [HttpPost]
    public ActionResult Edit(Guid id, TicketEditViewModel ticketEditViewModel,
                                                FormCollection fc) {
    
        if(fc["IsSendingQualitySurvey"].Contains("true")) {
            //Do something.
        }
    }    
    

    在视图中:

    <%= Html.CheckBoxFor(model => model.IsSendingQualitySurvey) %>
    

    希望这会有所帮助..

    【讨论】:

    • 我没有找到它,所以我使用了Request.Form["IsSendingQualitySurvey"].Contains("true"),尽管它太丑了=(
    【解决方案2】:

    模型绑定器可能不会拾取绑定。我的建议是将您的操作更改为:

     [HttpPost] 
     public ActionResult Edit(Guid id, TicketEditViewModel model)
    

    模型绑定器希望在请求中查找具有与您的对象名称匹配的前缀的属性。由于客户端没有命名前缀,所以没有前缀为“ticketEditViewModel”的属性。

    另一种方法是在页面上命名一个变量:

     <% var ticketEditViewModel = Model; %>
     <%= Html.CheckBoxFor(model => ticketEditViewModel.IsSendingQualitySurvey) %>
    

    【讨论】:

    • 我忘了说模型实际上是用正确的方式填充的,只是缺少一个属性。另外我不认为模型绑定器关心前缀,因为它甚至没有转移到结果输入,你确定吗?
    • 模型绑定器查看查询字符串或表单集合中包含的值,并尝试按名称绑定属性。您在客户端的 ID/Name 字段(由 HTML 帮助程序生成)包含名称空间,并且是您用于变量的命名约定的直接结果。如果您有复杂的模型或在页面上创建变量,您会注意到 HTML 帮助程序将在您的控件上生成与变量名称匹配的前缀。模型绑定器中可能有一些逻辑会涵盖不匹配的名称,但如果不挖掘反射器,我不能肯定地说。
    • 嗯,所以可能是因为我传递了两个参数,绑定器可能会引入命名空间,在这种情况下由于我的约定而找不到模型参数?还没有看到那些命名空间。明天我会调查一下,到目前为止谢谢。
    • 我的模型很简单,所以没有引入命名空间之类的东西。正如预期的那样,表单集合有[true, false]。重命名参数没有影响,并且像您建议的那样在页面上引入变量不是解决方案(太丑陋),与从formcollection中读取值相同...... id参数来自路由,模型填充正确。我不明白模型活页夹是怎么回事,也许我错过了一些非常微不足道的东西?
    • 如果没有你的项目进行一些测试,我没有答案给你,但我确实找到了这个页面:forums.asp.net/t/1314753.aspx 你会注意到 Dinoboy(第 5 篇文章)给出了一些关于如何在属性上调用模型绑定器。我建议您使用该 sn-p 并更改字段名称并尝试查看是否可以让 MB 正确解析您的属性并从那里开始。请记住,布尔属性的默认值为“false”。
    【解决方案3】:

    适用于以下型号:

    公共类 StartViewModel {

    public string Id{ get; set; }
    
    public string Name { get; set; }
    
    public bool Accept { get; set; }
    

    }

    -> 接受 =false。

    解决方法:更改 public bool Accept { get;放; } 到公共字符串 Accept { get;放; }

    提交时,如果选中复选框,则“Accept”值 =“on”。顺便检测一下checked的值。

    【讨论】:

      【解决方案4】:

      我不确定这是否适合您,但实际上它为我解决了同样的问题。尝试为同一模型的属性添加(而不是替换)隐藏字段,如下所示:

      @Html.HiddenFor(x => x.IsSendingQualitySurvey)
      

      【讨论】:

        猜你喜欢
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多