[c#] 在ASP.NET MVC 4中获取复选框值



Answers

由于您使用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\"" : "") />
Question

我正在研究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>

当我发布表单时,模型中的记住值始终为false。 但是,模型中的名称属性具有值。 我通过在下面设置一个断点来测试它:

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

我无法弄清楚。 为什么复选框值没有设置?




对于具有相同名称的多个复选框...删除不必要的错误代码:

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++;
}



修改像这样记住

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

在控制器中使用可空布尔值,并像这样在空值上回退到false

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



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

代替

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

尝试使用

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

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

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




只使用这个

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



对于使用Model的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);
}



我遇到了类似的问题,并能够通过使用复选框,hiddenfor和小JQuery来获取复选框值,如下所示:

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

<script>

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

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

    })

</script>



代替

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

使用:

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

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




Related