ASP.net MVC 3 обрабатывает несколько флажков в каждой строке моей таблицы - PullRequest
2 голосов
/ 03 сентября 2011

Я создаю интерфейс администратора для игры в угадывание слов, чтобы пользователи с правами администратора могли настроить игру, выбрав слова, которые появятся в игре, а затем выберите, какие буквы в словах будут закодированы.

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>

Частичная страница_ для каждого слова в таблице

@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. Я ожидал, что int [] будет заполнен индексом символа, выбранного для отображения.

Может кто-нибудь помочь мне понять, что я делаю не так?

1 Ответ

1 голос
/ 04 сентября 2011

Мне удалось решить эту проблему (но я все еще открыт для предложений по лучшему способу сделать это).

Я изменил следующую строку <input type="checkbox" name="DisplayCharPosition" value="@i" /> @lineword[i] на @Html.CheckBoxFor(x => x.DisplayCharPosition[i]) @lineword[i] и тип моей модели на public bool[] DisplayCharPosition { get; set; }, чтобы сохранить массив bool. Теперь массив bool имеет значение true / false для каждого символа, который пользователь хочет отобразить в игровой таблице. Затем я сохраняю это в базе данных в виде строки с разделителями-запятыми (например, 1,4,6 - которую я позже разделю, чтобы я знал, что символ в позициях 1, 4 и 6 должен отображаться, а остальные кодироваться).

Я также изменил свою модель следующим образом:

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;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...