Передать часть модели для просмотра проблемы в Asp.Net MVC - PullRequest
0 голосов
/ 07 января 2011

Я действительно не знал, какой заголовок задать этот вопрос, но я объясню здесь:

У меня есть представление с кучей полей ввода в таблице.Каждая строка в таблице представляет задачу, а каждый столбец - день недели и поля ввода в каждой ячейке, чтобы пользователь мог отработать часы ввода для этой задачи и дня.

Затем у меня есть кнопка отправкиопубликовать часы, когда пользователь хочет сохранить.Но вот проблема: у каждого временного сегмента (как называется объект, который содержит часы) также есть свойство Description, позволяющее пользователю написать описание того, что было сделано для определенного отчетного временного сегмента.

Так какможно ли получить свойство description для выбранного поля ввода временного сегмента и показать его в другом поле ввода «описание», а затем позволить пользователю изменить описание и сохранить его вместе с временным сегментом?

Вот что я сделалпока что:

Метод действия, чтобы получить описание:

    public ActionResult GetDescription(string name, int number, int year)
    {
        try
        {
            int taskId = Int32.Parse(name.SubstringAfter("Tasks[").Substring(0, 1));
            int timeSegmentId = Int32.Parse(name.SubstringAfter("CurrentTimeSegments[").Substring(0, 1));
            List<Task> tasks = _repository.GetCurrentTasks(number, year);
            var description = tasks[taskId].CurrentTimeSegments[timeSegmentId].Description;

            return Content(description);
        }
        catch (Exception)
        {

            return Content("");
        }
    }

jQuery:

    function getDescription() {
        $('.hourInput').focus(function () {
            var name = $(this).attr('name');
            var number = '<%: Model.WeekNumber %>';
            var year = '<%: Model.Year %>';
            var url = '<%=Url.Action("GetDescription", "Timesheet") %>';
            $.get(url, { name: name, number: number, year: year }, function (data) {
                $('#description').val(data);
            });
        });
    }

Теперь, как вы можете видеть, я должен разобрать атрибут nameполя ввода, чтобы получить объект, который я ищу, и это кажется чем-то вроде хака ... Но это единственный способ увидеть эту информацию.Итак, мой вопрос, есть ли другой более чистый способ сделать это?

ОБНОВЛЕНИЕ:

Вот часть, которая создает поля ввода во вложенном цикле for (цикл по каждой задаче, а затем длякаждая задача (все ее временные сегменты):

<% for (int i = 0; i < Model.Tasks.Count; i++)
           {
               var task = Model.Tasks[i];
        %>
        <tr class="taskrow">
            <td>
                <input type="button" value="Delete" id="<%:i %>" class="deletebutton" />
            </td>
            <td class="customer">
                <%: task.Project.Customer.Name %>
            </td>
            <td class="project">
                <%: task.Project.Name %>
            </td>
            <td class="task">
                <%: task.Name %>
            </td>
            <% for (int j = 0; j < task.CurrentTimeSegments.Count; j++)
               { %>
            <td>
                <%: Html.TextBoxFor(model => model.Tasks[i].CurrentTimeSegments[j].TimeSpanHours, new { @class = "hourInput" })%>
                <%: Html.ValidationMessageFor(model => model.Tasks[i].CurrentTimeSegments[j].TimeSpanHours)%>
            </td>
            <% } %>
            <td class="hourSum"><%:task.WeekTaskHours %></td>
        </tr>
        <% } %>

Обратите внимание, что этот код находится в частичном представлении, если это имеет значение.

1 Ответ

0 голосов
/ 07 января 2011

вы можете использовать функцию $.data jQuery для сохранения дополнительной информации в элементе this метода getDescription. Это необходимо сделать при создании этого элемента. Я не знаю, как вы это делаете и возможно ли это для вас в вашем нынешнем дизайне.

для сохранения информации это будет:

$(element).data('taskId', taskId);
$(element).data('timeSegmentId', timeSegmentId);

Если вы дадите код для создания этого элемента, я могу вам помочь.

Тогда getDescription метод будет

$('.hourInput').focus(function () {
   var taskId = $(this).data('taskId');
   vat timeSegmentId = $(this).data('timeSegmentId');
   var number = '<%: Model.WeekNumber %>';
   var year = '<%: Model.Year %>';
   var url = '<%=Url.Action("GetDescription", "Timesheet") %>';
   $.get(url, { taskId : taskId, timeSegmentId: timeSegmentId, number: number, year: year }, function (data) {
      $('#description').val(data);
   });
});

и так в вашем контроллере

public ActionResult GetDescription(string taskId, string timeSegmentId, int number, int year)
{
   try
   {
      List<Task> tasks = _repository.GetCurrentTasks(number, year);
      var description = tasks[taskId].CurrentTimeSegments[timeSegmentId].Description;

      return Content(description);
   }
   catch (Exception)
   {
      return Content("");
   }
}

EDIT:

В зависимости от того, как вы создаете текстовые поля ввода, я думаю, что вы можете сделать:

<td>
   <%: Html.TextBoxFor(model => model.Tasks[i].CurrentTimeSegments[j].TimeSpanHours, new { @class = "hourInput", id = "uniqueId_" + i + j })%>
   <%: Html.ValidationMessageFor(model => model.Tasks[i].CurrentTimeSegments[j].TimeSpanHours)%>
   <script type="text/javascript">
      $(document).ready(function() {
         var selector = '#uniqueId_<%=i %><%=j %>';
         $(selector).data('taskId', <%=i %>);
         $(selector).data('timeSegmentId', <%=j %>);
      });
   </script>
</td>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...