2011-09-03 32 views
2

我正在構建一個猜字遊戲的管理界面,因此管理員用戶可以通過選擇將出現在遊戲中的單詞來設置遊戲,然後選擇單詞中的哪些字母將被編碼。ASP.net MVC 3在我的表格的每一行中處理多個複選框

MainGameTable編輯頁面.....

@model GameServer.ViewModels.GameTableModel 

@section Javascript 
{ 
    <script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script> 
    <script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script> 
} 



@{ 
    ViewBag.Title = "GameTableEdit"; 
    Layout = "~/Views/Shared/_Layout.cshtml"; 
} 

<h2>GameTableEdit</h2> 

@using (Html.BeginForm("GameTableEdit", "Admin", FormMethod.Post, new { enctype = "multipart/form-data" })) 
{ 
    @Html.ValidationSummary(true) 
    <fieldset> 
     <legend>GameTable</legend> 
     @Html.HiddenFor(model => model.GameTableId) 
     @Html.HiddenFor(model => model.GameTableNumber) 

     <div class="editor-label"> 
      Table #: @Html.DisplayFor(model => model.GameTableNumber) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.SubjectId) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownListFor(model => model.SubjectId, new SelectList(Model.Subjects, "Key", "Value")) 
      @Html.ValidationMessageFor(model => model.SubjectId) 
     </div> 
     <div class="editor-label"> 
      @Html.LabelFor(model => model.ComplexityId) 
     </div> 
     <div class="editor-field"> 
      @Html.DropDownListFor(model => model.ComplexityId, new SelectList(Model.Complexities, "Key", "Value")) 
      @Html.ValidationMessageFor(model => model.ComplexityId) 
     </div> 

     <button type="submit" name="button" value="GetWords">Get Words</button> 

       @Html.Partial("GameMatrix/_LineWordsTable", Model) 

     <p> 
      <button type="submit" name="button" value="Save">Save</button> 
     </p> 

    </fieldset> 
} 



<div> 
    @Html.ActionLink("Back to List", "Index") 
</div> 

部分Page_for每個表中的單詞

@model GameServer.ViewModels.GameTableModel 
@if (Model.SelectedLinewords.Count != null && Model.SelectedLinewords.Count > 0) 
{ 

    <table> 
     <tr> 
      <th> 
       Select Word 
      </th> 
      <th> 
       LineWord 
      </th> 
      <th> 
       Characters to Display 
      </th> 
     </tr> 


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


    </table> 

} 

的編輯器模板的每一行:

@model GameServer.ViewModels.SelectedLineWord 
    <tr> 
<td> 
    @Html.CheckBoxFor(x => x.isSelected) 
</td> 
<td> 
    @Html.DisplayFor(x => x.LineWord) 
</td>  
<td> 

    @Html.HiddenFor(x=>x.LineWordId) 
    @Html.HiddenFor(x=>x.LineWord) 
    @{ char[] lineword = Model.LineWord.ToCharArray(); } 

    @for (int i = 0; i < Model.LineWord.Length; i++) 
    { 

     <input type="checkbox" name="DisplayCharPosition" value="@i" /> @lineword[i] 
    } 



</td> 
</tr> 

這裏是我的ViewModel

public class SelectedLineWord 
    { 
     [Required] 
     public Guid LineWordId { get; set; } 

     [Required] 
     public String LineWord { get; set; } 


     public int[] DisplayCharPosition { get; set; } 

     [Required] 
     public bool isSelected { get; set; } 

     public SelectedLineWord() 
     { 

     } 

     public SelectedLineWord(Guid linewordid, String word, String displaycharposition) 
     { 
      LineWordId = linewordid; 
      LineWord = word; 
      String[] pos = displaycharposition.Split(','); 

      DisplayCharPosition = new int[word.Length]; 

      for (int i = 0; i < word.Length; i++) 
      { 
       DisplayCharPosition[i] = 0; 
      } 

      for (int i = 0; i < pos.Length; i++) 
      { 
       DisplayCharPosition[Int32.Parse(pos[i])] = 1; 
      } 
     } 

     public SelectedLineWord(Guid linewordid, String word, bool issel) 
     { 
      LineWordId = linewordid; 
      LineWord = word; 
      isSelected = issel; 
     } 

    } 

    public class GameTableModel 
    { 

     [Required] 
     public Guid GameTableId { get; set; } 

     [Required] 
     public Guid GameMatrixId { get; set; } 


     [Required] 
     [Display(Name = "Table Subject")] 
     public int SubjectId { get; set; } 

     [Required] 
     [Display(Name = "Minimum Complexity")] 
     public int ComplexityId { get; set; } 


     [Required] 
     public int GameTableNumber { get; set; } 

     [Required] 
     [Display(Name = "Include a Bonus table")] 
     public bool IsBonus { get; set; } 

     [Display(Name = "Table Subject")] 
     public Dictionary<int, string> Subjects; 

     [Display(Name = "Minimum Complexity")] 
     public Dictionary<int, int> Complexities; 

     public List<GameTableLine> GameTableLines { get; set; } 
     public List<SelectedLineWord> SelectedLinewords { get; set; } 


     public GameTableModel() 
     { 
      try 
      { 

       //get a connection to the database 
       var data = new GameServerDataModelDataContext(); 

       //Fetch the subjects reference data 
       var subjects = from c in data.Subjects orderby c.Subject1 select new { c.SubjectId, c.Subject1}; 

       Subjects = new Dictionary<int, string>(); 

       foreach (var subject in subjects) 
       { 
        Subjects.Add(subject.SubjectId, subject.Subject1); 
       } 

       //Fetch the complexities questions 
       Table<Complexity> dComplexities = data.GetTable<Complexity>(); 

       Complexities = new Dictionary<int, int> { { 0, 0 } }; 
       foreach (var complexity in dComplexities) 
       { 
        if (complexity.Complexity1 != null) 
         Complexities.Add(complexity.ComplexityId, (int)complexity.Complexity1); 
       } 

      } 
      catch (Exception ex) 
      { 
       //[TODO: Complete the exception handeling code.] 
      } 
     } 
    } 

我的問題是,當我點擊保存按鈕時,傳遞給控制器​​的模型已經正確填充了所有內容,但是爲DisplayCharPosition選擇的複選框返回null。我期待的是一個int []填充了選擇顯示的字符的索引。

有人能幫我理解我做錯了什麼嗎?

回答

1

我已經設法解決這個問題(但我仍然願意提供更好的方法來解決這個問題)。

我所做的是我將以下行<input type="checkbox" name="DisplayCharPosition" value="@i" /> @lineword[i]更改爲@Html.CheckBoxFor(x => x.DisplayCharPosition[i]) @lineword[i],並將我的模型類型更改爲public bool[] DisplayCharPosition { get; set; },以便我存儲一個bool的數組。現在,布爾數組對於用戶想要在遊戲表中顯示的每個字符都有一個真/假值。然後我把它作爲一個逗號分隔的字符串存儲在數據庫中(例如,1,4,6 - 我後來分開了,所以我知道pos 1,4和6中的char必須顯示,其餘編碼)。

我也改變了我的模型如下:

public class SelectedLineWord 
    { 
     [Required] 
     public Guid LineWordId { get; set; } 

     [Required] 
     public String LineWord { get; set; } 


     public bool[] DisplayCharPosition { get; set; } 

     [Required] 
     public bool isSelected { get; set; } 

     public SelectedLineWord() 
     { 

     } 

     public SelectedLineWord(Guid linewordid, String word, String displaycharposition) 
     { 
      LineWordId = linewordid; 
      LineWord = word; 
      String[] pos = displaycharposition.Split(','); 

      DisplayCharPosition = new bool[word.Length]; 

      //set all to false 
      for (int i = 0; i < word.Length; i++) 
      { 
       DisplayCharPosition[i] = false; 
      } 

      //now only set the ones that were already in the db. 
      for (int i = 0; i < pos.Length; i++) 
      { 
       DisplayCharPosition[Int32.Parse(pos[i])] = true; 
      } 
     } 
+0

我沒有得到任何迴應,所以我已經關閉的問題,並接受我自己的答案。 – Sheedy75