2013-06-25 106 views
1

所以我有這個類,允許如果色彩被選擇或者不我檢查:在列表中設置對象的布爾值設置爲true

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是一個自定義助手,允許我顯示圖像。

但是,儘管盒子被檢查與否,但控制器中的值始終爲假,那麼我該怎麼做才能糾正?

+0

是否有代碼複選框更改字典的值? – Alexander

+0

嗯,嗯,我認爲渲染的視圖會照顧到,不是嗎?這不是「Html.CheckBoxFor」助手的目的嗎? – hsim

+0

您已將'mBlackColor'' mBlueColor'的值專門分配給'false'。我沒有看到任何代碼沒有設置爲'false' –

回答

0

你的語法稍微偏離了一點,你將它們都設置爲false。看here

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

那麼,我需要在開始時將它們設置爲false,因爲在另一種觀點中,如果我不以這種方式進行,它會崩潰。或者它是無用的?我不確定你爲什麼使用模數來設置它們? – hsim

+0

模數僅僅是一個從微軟鏈接中取得的例子。當它應該是'a =(b == c)'時,你正在使用'a = b = c'。但是如果你的初衷是把它們全部設爲假,我就會誤讀並道歉。 – Alexander

0

大廈掉什麼傑森·埃文斯建議你也可以重構你的代碼,所以你沒有違反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> 
+0

不過,我無法訪問'Model.ListColors [idx]'因爲我的字典是一個字符串而不是int。看起來像'for'循環不能遍歷'Dictionary '? – hsim

+0

也許你可以改變你的模型,以便它更多地反映你的工作數據,然後將它作爲列表而不是字典公開。 – Jay

+0

嗯,其實我只能專注於顏色並檢查模型中的顏色是否以這種方式命名。合理的建議,我會嘗試這種方法。 – hsim

0

如果我錯了,請downvote,但它不應該與Value

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

+0

從我這裏沒有倒退,但我已經嘗試過這種方法,這並沒有改變一件事情,我現在正在嘗試Jay的方法。 – hsim