2011-01-07 12 views
0

私は本当にこの質問を与えるためにどのようなタイトルを知りませんでしたが、私は、ここで説明します:モデルのパス部分

私は入力フィールドの束を持つビューを持っていますテーブル。表の各行はタスクを表し、各列は曜日を表し、各セルの入力フィールドはユーザーがそのタスクとその日に作業した時間を入力できるようにします。

私は、ユーザーが保存したいときに時間を投稿する送信ボタンを持っています。しかし、ここに問題があります:時間を保持するオブジェクトが呼び出されるたびに、timegmentはプロパティーDescriptionを持ち、報告された特定の時間セグメントに対して何が行われたのかを記述できるようにします。

は、どのように私は、選択したtimesegment入力フィールドの説明プロパティを取得し、別の「説明」入力フィールドにそれを表示し、ユーザーが説明を変更してみましょうとtimesegmentでそれを救うことができますか?

対処方法を説明得るために:

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:

ここ入力(各タスクをループし、各タスクのすべてのtimesegments)ループの入れ子になったのフィールドを作成する部分は次のとおり

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

$.data jQuery関数を使用してgetDescriptionメソッドのthis要素に余分な情報を保存することができます。この要素を作成するときは、この操作を行う必要があります。私はあなたがどのようにそれを行い、あなたの現在のデザインであなたのために可能であるかわからない。

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

お返事ありがとうございます。興味深いと思いますが、私は自分のコードでこれを行うことができるかどうか確信していません...私の更新からわかるように、入力フィールドは部分的なビューのループで作成されます。だから私はどのようにこのループ内で作成されているように私は各フィールドにjQueryを介してデータを追加するか分からない? – Anders

+0

入力ボックスのデータをどのように初期化できるかを私の答えに編集しました。しかし、あなたはHTMLの中にスクリプトを入れているので、私は本当にそれが好きではありません... –

+0

これは、私がすでに持っていたものよりも良くないとは思わないし、jQueryでも専門家ではありませんが、どのように動作するか見てみましょう - (ドキュメント).ready関数は、ドキュメントが最初に読み込まれたときにのみ実行されます。 – Anders

関連する問題