2011-09-03 72 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

相关问题