2011-01-07 3 views
0

Asp.Net MVC에서 문제를 보는,하지만 난 여기에 설명하겠습니다 :패스 부분은 정말이 질문을주고 어떤 제목 몰랐다

내가 입력 필드의 무리와보기를 테이블. 테이블의 각 행은 작업을 나타내고 각 열은 평일이며 각 셀의 입력 필드는 사용자가 해당 작업 및 요일에 대해 근무한 시간을 입력하게합니다.

사용자가 저장하려고하는 시간을 게시하는 제출 버튼이 있습니다. 하지만 여기에 문제가 있습니다. 각 시간대 (시간을 보유하는 객체와 같이)에는 설명 된 속성이있어 사용자가보고 된 특정 시간 세그먼트에 대해 수행 된 작업에 대한 설명을 쓸 수 있습니다.

그렇다면 선택한 시간 세그먼트 입력 필드에 대한 설명 속성을 가져 와서 다른 "설명"입력 필드에 표시 한 다음 설명을 수정하고 시간대와 함께 저장하게하려면 어떻게해야합니까? 여기

내가 지금까지 한 일이다 :

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 속성을 파싱하여 내가 가지고있는 객체를 가져오고 이것은 약간의 해킹처럼 보입니다 ... 그러나이 정보를 얻기 위해 볼 수있는 유일한 방법입니다. 그래서 내 질문에, 거기에 또 다른 청소기 방법이 무엇입니까?

는 UPDATE :

<% 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> 
     <% } %> 

주 코드한다 : 여기서

는 루프 중첩의 입력 필드 (모든 timesegments 각 태스크에 각각의 작업을 반복하는 등)를 만드는 부분 중요하다면 부분보기에 있습니다.

답변

0

$.data jQuery 함수를 사용하여 getDescription 메서드의 this 요소에 추가 정보를 저장할 수 있습니다. 이 요소를 만들 때이 작업을 수행해야합니다. 나는 당신이 그것을 어떻게 그리고 당신의 현재 디자인에서 가능할 지 모른다.

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

당신이이 요소를 생성 코드를주는 경우에, 나는 당신을 도울 수 :

는 것이다 정보를 저장합니다.

그런 다음 getDescription 방법은 컨트롤러

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(""); 
    } 
} 

편집에

$('.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); 
    }); 
}); 

등이 될 것입니다 : 당신이 입력 텍스트 상자를 만드는 방법에 따르면

을, 당신이 할 수 있다고 생각 :

<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> 
+0

답장을 보내 주셔서 감사합니다. 흥미로운 것 같습니다. 내 코드로이 작업을 수행 할 수 있는지 확신 할 수 없습니다 ...내 업데이트에서 볼 수 있듯이 입력 필드는 부분 뷰의 루프에 만들어집니다. 따라서이 루프 내에서 jQuery를 통해 각 필드에 데이터를 추가하는 방법을 알지 못합니다. – Anders

+0

입력 상자에 데이터를 초기화하는 방법을 제공하기 위해 필자의 대답을 편집했습니다. 그러나 당신이 HTML 안에 스크립트를 넣었 기 때문에 나는 그것을 정말로 좋아하지 않는다 ... –

+0

글쎄, 그게 내가 이미 가지고있는 것보다 나을 것 같지 않고, jQuery에서 전문가가 아니지만, 그것이 작동하는 방법을 보지 마라 - (document) .ready 함수는 내가 아는 한 문서가 처음로드 될 때만 실행된다. – Anders