2013-02-06 27 views
99

我正在开发ASP.NET MVC 4应用程序。这个程序有一个基本的形式。我的表单的模型如下所示:获取ASP.NET MVC 4中的复选框值

public class MyModel 
{ 
    public string Name { get; set; } 
    public bool Remember { get; set; } 
} 

在我的表单中,我有以下HTML。

<input id="Name" name="Name" type="text" value="@Model.Name" /> 
<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" /> 
<label for="Remember">&nbsp;Remember Me?</label> 

当我发布表单时,模型中的Remember值始终为false。但是,模型中的名称属性具有值。我已经通过在下面设置断点测试了这个:

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
    Console.WriteLine(model.Remember.ToString()); 
} 

我弄不明白。为什么复选框值没有设置?

+0

是否得到贴有正确的价值?你能检查使用提琴手吗?此外,我不知道是否/如何复选框的价值转化为布尔。 – shahkalpesh

+0

这会在窗体上显示为“开”或“关”。这显然没有正确的约束。我做了一个愚蠢的枚举来避免这种情况。 – Yablargo

+0

@Yablargo,你不需要枚举。只需将value =“true”添加到输入标签即可。并使用如下所示的value =“false”的隐藏。 –

回答

171
@Html.EditorFor(x => x.Remember) 

会生成:

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

它是如何工作:

  • 如果checkbox仍然不加以控制,表单提交的只有hidden值(false)
  • 如果选中,然后表单提交两个字段(false和true)和MVC设置 true为模型的bool财产

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" />

这将始终发送默认值,如果检查。

+6

嗨,这种行为会导致我的模型无法验证,因为它似乎无法弄清楚如何将[true,false ]转换为一个布尔值。你如何解决这个问题? –

+0

@ObiOnuorah你在用什么建筑?助手或硬编码的HTML标记? – webdeveloper

+4

Html.EditorFor或Html.CheckBoxFor或者给出了相同的结果 –

3

而不是

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" /> 

使用:

@Html.EditorFor(x => x.Remember) 

这会给你一个复选框专门用于记住

61

由于您使用Model.Name设定值。我假设你将一个空视图模型传递给视图。

因此,Remember的值为false,并将复选框元素上的值设置为false。这意味着当您选择复选框时,您将在表单中发布值“false”。如果不选择它,则不会发布,因此该模型默认为false。这就是为什么你在这两种情况下都会看到错误的价值。

该值仅在您选中该复选框时才会通过。要在Mvc中执行复选框,请使用

@Html.CheckBoxFor(x => x.Remember) 

或者如果您不想将模型绑定到视图。

@Html.CheckBox("Remember") 

Mvc用隐藏字段做一些神奇的事情,当它们没有被选中时它们会持久存在。

编辑,如果你真的厌恶这样做,并想自己生成元素,你可以做。

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked=\"checked\"" : "") /> 
+1

'@ Html.CheckboxFor'代码实际上应该是'@Html。CheckBoxFor' – fujiiface

+0

只是一个快速的一个你将如何使用单选按钮上的@(Model.Remember?)checked = \“checked \”“:”“)?或者是不可能的 – Izzy

+0

有了这个选项,你只是直接操纵HTML,单选按钮只是'type =“radio”',选择你想在HTML中选择的那个与上面相同,'checked =“检查“'。不同之处在于您将有多个具有相同名称的''元素。你需要弄清楚哪一个应用额外的HTML。 –

4

好的,复选框有点奇怪。 当您使用Html帮助程序时,它会在标记上生成两个复选框输入,并且如果选中它们,它们将作为名称 - 值对的IEnumerable传入。

如果未在标记上进行检查,则只传入隐藏的输入,其值为false。

因此,例如,在标记您有:

 @Html.CheckBox("Chbxs") 

并在控制器动作(确保名称匹配的控制器上的复选框PARAM名):然后在

 public ActionResult Index(string param1, string param2, 
     string param3, IEnumerable<bool> Chbxs) 

控制器,你可以做一些像这样的东西:

 if (Chbxs != null && Chbxs.Count() == 2) 
     { 
      checkBoxOnMarkup = true; 
     } 
     else 
     { 
      checkBoxOnMarkup = false; 
     } 

我知道这不是一个优雅的解决方案。希望这里的某个人可以提供一些建议。

3

将表单中的复选框返回的值转换为布尔属性我在定制的ModelBinder中使用了构建转换器中的ValueProviderResult。

ValueProviderResult cbValue = bindingContext.ValueProvider.GetValue("CheckBoxName"); 
bool value = (bool)cbValue.ConvertTo(typeof(bool)); 
2

我遇到了类似的问题,并能够通过使用复选框,hiddenfor和小JQuery的,像这样得到的复选框值回:

@Html.CheckBox("isPreferred", Model.IsPreferred) 
@Html.HiddenFor(m => m.IsPreferred) 

<script> 

    $("#isPreferred").change(function() { 

     $("#IsPreferred").val($("#isPreferred").val()); 

    }) 

</script> 
0

我只是碰到了这个(我可以”相信它不会绑定/关闭!)

反正!

<input type="checkbox" name="checked" /> 

将发表“开”或“关”的值。

This WONT绑定到一个布尔值,但是你可以做这个愚蠢的解决方法!

public class MyViewModel 
{ 
    /// <summary> 
    /// This is a really dumb hack, because the form post sends "on"/"off" 
    /// </summary>      
    public enum Checkbox 
    { 
     on = 1, 
     off = 0 
    } 
    public string Name { get; set; } 
    public Checkbox Checked { get; set; } 
} 
1
@Html.EditorFor(x => x.ShowComment) 


$(function() { 
     // set default value to control on document ready instead of 'on'/'off' 
     $("input[type='checkbox'][name='ShowComment']").val(@Model.ShowComment.ToString().ToLower()); 
    }); 

    $("#ShowComment").change(function() { 
     // this block sets value to checkbox control for "true"/"false" 

     var chkVal = $("input[type='checkbox'][name='ShowComment']").val(); 
     if (chkVal == 'false') $("input[type='checkbox'][name='ShowComment']").val(true); 
     else $("input[type='checkbox'][name='ShowComment']").val(false); 

    }); 
+2

Hello Surendran欢迎来到Stack Overflow。当您包含代码时,请将其格式化以提高可读性。但更重要的是,解释为什么包含的代码解决OP的问题至关重要。 –

0

对于有多个同名复选框...代码,以消除不必要的错误:

List<string> d_taxe1 = new List<string>(Request.Form.GetValues("taxe1")); 
d_taxe1 = form_checkbox.RemoveExtraFalseFromCheckbox(d_taxe1); 

功能

public class form_checkbox 
{ 

    public static List<string> RemoveExtraFalseFromCheckbox(List<string> val) 
    { 
     List<string> d_taxe1_list = new List<string>(val); 

     int y = 0; 

     foreach (string cbox in val) 
     { 

      if (val[y] == "false") 
      { 
       if (y > 0) 
       { 
        if (val[y - 1] == "true") 
        { 
         d_taxe1_list[y] = "remove"; 
        } 
       } 

      } 

      y++; 
     } 

     val = new List<string>(d_taxe1_list); 

     foreach (var del in d_taxe1_list) 
      if (del == "remove") val.Remove(del); 

     return val; 

    }  



} 

使用它:

int x = 0; 
foreach (var detail in d_prix){ 
factured.taxe1 = (d_taxe1[x] == "true") ? true : false; 
x++; 
} 
0
public ActionResult Index(string username, string password, string rememberMe) 
{ 
    if (!string.IsNullOrEmpty(username)) 
    { 
     bool remember = bool.Parse(rememberMe); 
     //... 
    } 
    return View(); 
} 
1

这一直是一个主要的痛苦,感觉应该更简单。这是我的设置和解决方案。

我用下面的HTML帮助:

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

然后,控制器,我检查的形式收集和处理相应:

bool activeFlag = collection["ActiveFlag"] == "false" ? false : true; 
[modelObject].ActiveFlag = activeFlag; 
0

修改记住这样

public class MyModel 
{ 
    public string Name { get; set; } 
    public bool? Remember { get; set; } 
} 

在控件中使用可空bool缪勒和后备假的空这样

[HttpPost] 
public ActionResult MyAction(MyModel model) 
{ 
    model.Remember = model.Remember ?? false; 
    Console.WriteLine(model.Remember.ToString()); 
} 
1

只能使用此

$("input[type=checkbox]").change(function() { 
    if ($(this).prop("checked")) { 
     $(this).val(true); 
    } else { 
     $(this).val(false); 
    } 
}); 
+0

或者:$(this).val($(this).is(“:checked”));' – Norman

0

在我来说,我没有设置get方法模型属性“记住”。检查控制器中的逻辑。你可能也在做同样的事情。我希望这有助于!

0

对于MVC使用模型。 型号:

public class UserInfo 
{ 
    public string UserID { get; set; } 
    public string UserName { get; set; } 
    public string Password { get; set; } 
    public bool RememberMe { get; set; } 
} 

HTML:

<input type="checkbox" value="true" id="checkbox1" name="RememberMe" checked="@Model.RememberMe"/> 
<label for="checkbox1"></label> 

在[HttpPost]功能,我们可以得到它的属性。

[HttpPost] 
public ActionResult Login(UserInfo user) 
{ 
    //... 
    return View(user); 
} 
0

如果您确实想使用纯HTML(无论出于何种原因)而不是内置的HtmlHelper扩展,您可以这样做。

而不是

<input id="Remember" name="Remember" type="checkbox" value="@Model.Remember" /> 

尝试在HTML工作中使用

<input id="Remember" name="Remember" type="checkbox" value="true" @(Model.Remember ? "checked" : "") /> 

复选框上输入,这样,当他们检查,他们发送的值,而当不是在他们检查,它们根本不会发送任何东西(这会导致ASP.NET MVC回退到字段的缺省值false)。此外,HTML中复选框的值可以是任何不只是真/假的,所以如果你真的想要,你甚至可以在你的模型中使用一个复选框作为字符串字段。

如果您使用内置的Html.RenderCheckbox,它实际上会输出两个输入:复选框和隐藏字段,以便在取消选中该复选框时发送一​​个错误值(而不是任何内容)。这可能会导致一些意外情况,比如: