2009-06-08 3 views
0

Ich habe eine LINQ to SQL-Entity-Klasse mit einer NULL-fähigen int-Eigenschaft namens sTime, die ich verwende, um die Anzahl der für eine Task eingeplanten Sekunden aufzuzeichnen. z.B. Datenbankfeld 120000MVC View Textbox String-Eingabe in TimeSpan zu Zeit in Sekunden Integer

Ich habe versucht, der Task-Klasse eine Eigenschaft hinzuzufügen, aber wie stelle ich diese Eigenschaft zu Beginn ein, wenn ich eine LINQ to SQL-Entität verwende.

public TimeSpan ScheduledTimeSpan {get; private set;} 

int seconds = sTime ?? 0; 
TimeSpan ts = new TimeSpan(0, 0, 0, seconds, 0); 
ScheduledTimeSpan = ts; 

ich tun würde, dies in meiner Ansicht

<td><%= Html.Encode(task.ScheduledTimeSpan.TotalSeconds.ToString("hh:mm:ss")) %></td> 

Mit MVC Ich bin nicht sicher, wie und wo sTime richtig zu setzen und, wenn ich Updatemodel (Aufgabe) verwenden; in meinem Task-Controller. Ich dachte, dass ich eine TimeSpan in der Controller-Aktion erstellen muss, wenn ich die Get-Funktion mache, aber das scheint mir nicht richtig zu sein, auch wo ich diese Eigenschaft einstellen sollte? Wer kann helfen?

+0

Können Sie bitte erklären, was Sie wollen? Ich bin mir nicht sicher, ob Sie wissen möchten, wie Sie sTime am besten als Zeitspanne erhalten ODER wenn Sie wissen möchten, wie Sie ein Formular posten und dann einige Daten an sTime oder etwas ganz anderes setzen/binden! :-) Prost, Charles. – Charlino

Antwort

1

Ja, das macht jetzt Sinn. :-)

Dies ist, wie ich es ...

Teilklasse für Ihre TaskClass

public partial class Task 
{ 
    public TimeSpan ScheduledTimeSpan 
    { 
     get 
     { 
      int seconds = sTime ?? 0; 
      return new TimeSpan(0, 0, seconds); 
     } 

     set 
     { 
      if (value != null) 
       sTime = (int)value.TotalSeconds; 
     } 
    } 
} 

Dann ist Ihre Ansicht ändern nähern würde

<p> 
    <label for="ScheduledTimeSpan">Scheduled Time:</label> 
    <%= Html.TextBox("ScheduledTimeSpan", Model.Task.ScheduledTimeSpan.ToString("hh:mm:ss"))%> 
    <%= Html.ValidationMessage("ScheduledTimeSpan", "*") %> 
</p> 

zu haben, die alle funktionieren sollte fein und dandy unter der Annahme, dass der Modellbinder kein Problem hat, eine "hh: mm: ss" Zeichenfolge an eine Zeitspanne zu binden.

Wenn es Probleme hat, lass es mich wissen.

HTHS, Charles

+0

Danke für die Antwort. Ich habe das noch nicht ausprobiert, ich habe das schon für diese Eigenschaft geschrieben, aber wie das Set funktionierte, verwirrte mich. Ich dachte an den gleichen Ansatz, wie Sie oben gezeigt haben, was ich nicht verstehe und untersuchen muss, ist, wie dies in Bezug auf die Aktualisierung des Modells funktioniert. Ich kann sehen, das Set ändert sTime aber wie das schließlich nur funktioniert ist, was ich bin unklar .. kann nur im Moment erraten. – Pricey

+1

Wenn der Wert aus der Formulareingabe "ScheduledTimeSpan" zurückgebucht wird, analysiert der Modellbinder ihn in einen TimeSpan und legt dann die ScheduledTimeSpan-Eigenschaft des Modells fest, die wiederum die Eigenschaft "sTime" festlegt. Also wird es das Modell aktualisieren. Kapieren? – Charlino

+0

Klingt magisch :) danke Charlino – Pricey

0

Dies ist der Eingang Textbox auf meiner Ansicht

  <p> 
      <label for="sTime">sTime:</label> 
      <%= Html.TextBox("sTime", Model.Task.sTime)%> 
      <%= Html.ValidationMessage("sTime", "*") %> 
     </p> 

Dies ist der Code in meinem .dbml designer.cs hinter.

 [Column(Storage="_sTime", DbType="Int")] 
    public System.Nullable<int> sTime 
    { 
     get 
     { 
      return this._sTime; 
     } 
     set 
     { 
      if ((this._sTime != value)) 
      { 
       this.OnsTimeChanging(value); 
       this.SendPropertyChanging(); 
       this._sTime = value; 
       this.SendPropertyChanged("sTime"); 
       this.OnsTimeChanged(); 
      } 
     } 
    } 

Hier ist der Code von meinem Task-Controller für die Bearbeitungsaktion.

// 
// GET: /Tasks/Edit/5 

public ActionResult Edit(int id) 
{ 
    Task task = taskRepo.GetTask(id); 

    return View(new TaskViewModel(task)); 
} 

// 
// POST: /Tasks/Edit/5 

[AcceptVerbs(HttpVerbs.Post)] 
public ActionResult Edit(int id, FormCollection collection) 
{ 
    Task task = taskRepo.GetTask(id); 

    try 
    { 
     UpdateModel(task); 

     taskRepo.Save(); 

     return RedirectToAction("Details", new { id = task.taskId }); 
    } 
    catch 
    { 

    ModelState.AddRuleViolations(task.GetRuleViolations()); 
     return View(new TaskViewModel(task)); 
    } 
} 

sTime eine ganze Zahl (in Sekunden), und es muss das sein, wenn es das Datenbankfeld geht in .. aber die Schnittstelle für diesen Wert muss eine Reihe von HH sein: MM: SS.

Deshalb versuche ich eine TimeSpan zu verwenden, weiß aber nicht, wo oder wie ich das einrichten soll.

Macht es das überhaupt klarer?