将部分模型传递给Asp.Net MVC中的View问题

时间:2011-01-07 12:47:22

标签: asp.net jquery asp.net-mvc-2

我真的不知道提出这个问题的标题,但我会在这里解释一下:

我在表格中有一堆输入字段。表中的每一行代表一个任务,每一列代表一个工作日,每个单元格中的输入字段用于让用户输入该任务和日期的工时。

然后我有一个提交按钮来发布用户想要保存的小时数。但问题在于:每个时间段(作为保持小时数的对象被调用)也具有属性描述,让用户写下已报告的特定时间段的描述。

那么如何获取所选时间段输入字段的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 :(得分:0)

您可以使用$.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("");
   }
}

编辑:

根据您创建输入文本框的方式,我认为您可以这样做:

<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>
相关问题