【问题标题】:Setting the value of an object's boolean in a list to true将列表中对象的布尔值设置为 true
【发布时间】:2013-06-22 11:57:52
【问题描述】:

所以我有这个类可以让我检查是否选择了颜色:

public class Colors
{
    public bool mIsSelected { get; set; }
    public string mName { get; set; }
}

在将列表发送到视图之前,我使用以下值填充它:

public List<Colors> mListColors = new List<Colors>();

mListColors.Add(new Colors{ mIsSelected = false, mName = "black"});
mListColors.Add(new Colors { mIsSelected = false, mName = "blue" });
mListColors.Add(new Colors { mIsSelected = false, mName = "white" });
mListColors.Add(new Colors { mIsSelected = false, mName = "red" });
mListColors.Add(new Colors { mIsSelected = false, mName = "green" });

在我看来,我是这样渲染它们的:

@for (int i = 0; i < Model.mListColors.Count; i++)
{
    var item = Model.mListColors[i];

switch (item.mName)
{
    case "black":
        @Html.Image("~\\Images\\Functional\\blackColor.jpeg", item.mName.ToUpper(), null)
        @Html.CheckBoxFor(_item => Model.mListColors[i].mIsSelected, item.mIsSelected)
        @Html.HiddenFor(_item => _item.mListColors[i].mName)
        break;
    case "blue":
        @Html.Image("~\\Images\\Functional\\blueColor.jpeg", item.mName.ToUpper(), null)
        @Html.CheckBoxFor(_item => Model.mListColors[i].mIsSelected, item.mIsSelected)
        @Html.HiddenFor(_item => _item.mListColors[i].mName)
        break;
    case "red":
        @Html.Image("~\\Images\\Functional\\redColor.jpeg", item.mName.ToUpper(), null)
        @Html.CheckBoxFor(_item => Model.mListColors[i].mIsSelected, item.mIsSelected)
        @Html.HiddenFor(_item => _item.mListColors[i].mName)
        break;
    case "green":
        @Html.Image("~\\Images\\Functional\\greenColor.jpeg", item.mName.ToUpper(), null)
        @Html.CheckBoxFor(_item => Model.mListColors[i].mIsSelected, item.mIsSelected)
        @Html.HiddenFor(_item => _item.mListColors[i].mName)
        break;
    case "white":
        @Html.Image("~\\Images\\Functional\\whiteColor.jpeg", item.mName.ToUpper(), null)
        @Html.CheckBoxFor(_item => Model.mListColors[i].mIsSelected, item.mIsSelected)
        @Html.HiddenFor(_item => _item.mListColors[i].mName)
        break;
}

}

这样我就可以有一个复选框并将值设置为 true 或 false,具体取决于复选框是否被选中。 HtmlImage 是一个自定义助手,它允许我显示图像。

但无论是否选中该框,控制器中的值始终为 false,那么我该怎么做才能更正呢?

【问题讨论】:

  • 是否有任何代码可以让复选框更改字典的值?
  • 嗯,好吧,我认为渲染视图会解决这个问题,不是吗?这不是Html.CheckBoxFor 助手的目的吗?
  • 您专门将mBlackColor mBlueColor 的值分配给false。我没有看到任何未设置的代码 false
  • 你真的不需要那个开关。您可以通过这种方式删除大量代码。当你说“控制器中的值总是假的”时,你在哪里检查?
  • 关于开关的好点,我只是想让事情正常进行。然后我签入我的控制器,在我的回发方法中,我得到了包含 List&lt;Colors&gt; 的模型。

标签: c# asp.net-mvc razor checkbox


【解决方案1】:

您的语法有点不对劲,您将它们全部设置为 false。看here

// Assign the result of a boolean expression to b.
b = (days % 2 == 0);

【讨论】:

  • 好吧,我需要在开始时将它们设置为 false,因为在另一个视图中,如果我不这样做会崩溃。还是没用?而且我不确定您为什么要使用模数来设置它们?
  • 模数只是取自微软链接的一个例子。您正在使用a = b = c,它应该是a = (b == c)。但是,如果您的意图是最初将它们全部设置为 false,我会误读并道歉。
【解决方案2】:

根据 Jason Evans 的建议,您还可以重构代码,以免违反 DRY

@for(int idx = 0;idx < Model.ListColors.Count;idx++)
{
    var item = Model.ListColors[idx]
    @Html.Image(string.Format(
           "~\\Images\\Functional\\{0}Color.jpeg",
           item.Name.ToLower()), item.Name, null)
    @Html.CheckBoxFor(model => Model[idx].IsSelected, item.IsSelected)
    @Html.HiddenFor(model => Model[idk].Name)
}

更新

您可能需要考虑创建一个更准确地反映您的数据的模型:

public class Colors
{
    public bool IsSelected {get;set;}
    public string Name {get;set;}
}

并将您的模型公开为:

@model IEnumerable<Colors>

【讨论】:

  • 我仍然无法访问Model.ListColors[idx],因为我的字典是字符串而不是整数。似乎for 循环无法遍历Dictionary&lt;string, bool&gt;
  • 也许您可以更改模型,使其更能反映您使用的数据,然后将其公开为列表而不是字典。
  • 嗯,确实我只能专注于颜色并检查模型中的颜色是否以这种方式命名。中肯的建议,我会尝试这种方法。
  • 但另一个问题摆在面前。我需要检查是否检查了超过 1 个项目以应用某种行为,但我不知道该怎么做。这就是我一开始创建字典的原因,以便我可以检查这种可能性。
  • 像这样遍历字典: foreach (KeyValuePair pair in myDictionary) { //... }
【解决方案3】:

如果我又错了,请投反对票,但不应该是Value吗?

@Html.CheckBoxFor(_item =&gt; color.Value, Model.mListColors["Blue"].Value)

【讨论】:

  • 我没有反对,但我已经尝试过这种方法,这并没有改变任何事情。我现在正在尝试杰的方法。
猜你喜欢
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-19
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
相关资源
最近更新 更多