2011-01-07 16 views
0

Ich wusste nicht wirklich, was Titel, diese Frage zu geben, aber ich werde hier erklären:Pass Teil des Modells anzeigen Problem in Asp.Net MVC

Ich habe eine Ansicht mit einem Bündel von Eingabefeldern in ein Tisch. Jede Zeile in der Tabelle stellt eine Aufgabe und jede Spalte einen Wochentag dar, und die Eingabefelder in jeder Zelle dienen dazu, dem Benutzer die Stunden für diese Aufgabe und diesen Tag einzugeben.

Ich habe dann eine Schaltfläche senden, um die Stunden zu buchen, wenn der Benutzer speichern möchte. Aber hier ist das Problem: Jedes Zeitsegment (da das Objekt, das Stunden enthält, aufgerufen wird) hat auch die Eigenschaft Beschreibung, damit der Benutzer eine Beschreibung dessen schreiben kann, was für ein bestimmtes angegebenes Zeitsegment getan wurde.

Also wie könnte ich die Beschreibung Eigenschaft für das ausgewählte Zeitsegment Eingabefeld und zeigen Sie es in einem anderen "Beschreibung" Eingabefeld, und dann lassen Sie den Benutzer ändern Sie die Beschreibung und speichern Sie sie mit dem Zeitsegment?

Hier ist, was ich bisher getan habe:

Methode

Aktion die Beschreibung zu erhalten:

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

Nun, wie Sie sehen können, muss ich analysiere das Namensattribut des Eingabefeldes, um das Objekt zu erhalten, nach dem ich suche, und das scheint ein bisschen wie ein Hack zu sein ... Aber es ist der einzige Weg, wie ich diese Informationen bekommen kann. Also meine Frage ist, gibt es einen anderen saubereren Weg, dies zu tun?

UPDATE:

Hier ist der Teil, der die Eingabefelder in einer verschachtelten for-Schleife erzeugt (durch jede Aufgabe Looping und dann für jede Aufgabe alle seine 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> 
     <% } %> 

Beachten Sie, dass dieser Code ist in einer Teilansicht, wenn es darauf ankommt.

Antwort

0

Sie könnten die $.data jQuery-Funktion verwenden, um zusätzliche Informationen in Ihrem this Element der getDescription Methode zu speichern. Sie müssen das tun, wenn Sie dieses Element erstellen. Ich weiß nicht, wie Sie das machen und ob es Ihnen in Ihrem aktuellen Design möglich ist.

die Informationen speichern es sein würde:

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

Wenn Sie den Code geben, wo Sie dieses Element zu erstellen, ich könnte Ihnen helfen.

Dann wird die getDescription Methode

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

und so in Ihrem Controller

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 wäre:

Je nachdem, wie Sie erstellen, um die Eingabetextfelder, ich glaube, Sie tun können, :

<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

Danke für deine Antwort. Es klingt interessant, ich bin mir nur nicht sicher, ob ich das mit meinem Code machen kann ...Wie Sie in meinem Update sehen können, werden die Eingabefelder in einer Schleife in einer Teilansicht erstellt. Also habe ich keine Ahnung, wie ich Daten durch jQuery zu jedem Feld hinzufügen würde, während es innerhalb dieser Schleife erstellt wird? – Anders

+0

Ich habe meine Antwort bearbeitet, um Ihnen zu zeigen, wie Sie die Daten in Ihren Eingabefeldern initialisieren können. Allerdings mag ich es nicht wirklich, weil Sie das Skript in den HTML-Code einfügen ... –

+0

Nun, nein, das fühlt sich nicht besser an als das, was ich bereits hatte, und ich bin kein Experte für jQuery, aber ich weiß nicht, t sehen, wie es funktionieren könnte - die (Dokument) .ready Funktion läuft nur, wenn das Dokument zum ersten Mal geladen wird, soweit ich weiß? – Anders