我真的不知道提出这个问题的标题,但我会在这里解释一下:
我在表格中有一堆输入字段。表中的每一行代表一个任务,每一列代表一个工作日,每个单元格中的输入字段用于让用户输入该任务和日期的工时。
然后我有一个提交按钮来发布用户想要保存的小时数。但问题在于:每个时间段(作为保持小时数的对象被调用)也具有属性描述,让用户写下已报告的特定时间段的描述。
那么如何获取所选时间段输入字段的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>
<% } %>
请注意,如果重要,此代码处于部分视图中。
答案 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>