2016-06-29 12 views
2

Ich habe einen Controller, der zum Speichern von Daten in der Datenbank verwendet wird. Der Controller sieht aus wie folgt:Entfernen von Funktionalität von ASP.NET MVC-Controller

[Authorize] 
[HttpPost] 
public ActionResult Create(EmployeeFormViewModel viewModel) 
{ 
    var _employee = new Employee 
    { 
     Employee = User.Identity.GetUserId(), 
     DateTime = DateTime.Parse(string.Format("{0} {1}", viewModel.Date, viewModel.Time)) 
    }; 

    _context.Employees.Add(_employee); 
    _context.SaveChanges(); 

    return RedirectToAction("Index", "Home"); 
} 

ich diese Codezeile entfernen möchten

DateTime.Parse(string.Format("{0} {1}", viewModel.Date, viewModel.Time)) 

und diese Berechnungen woanders machen, um die Steuerung sauber zu halten. Welches ist der beste Weg, dies zu archivieren?

+0

Haben Sie in Betracht gezogen, diesen Code in den Konstruktor des Mitarbeiters zu verschieben und einfach 'var_employee = new Employee (User.Identity.GetUserId, viewModel.Date, viewModel.Zeit) 'und Parsing es dort? –

+0

Erstellen Sie eine Data-Mapper-Klasse, die die Daten des Ansichtsmodells einer Entitätsinstanz zuordnet. –

Antwort

4

Aus den Daten gegeben Ich sehe, dass Sie ein Ansichtsmodell EmployeeFormViewModel die Logik saperate aus dem Modell namens verwendet haben. Ich würde vermuten, dass Ihr Ansichtsmodell etwas wie unten aussieht:

public class EmployeeFormViewModel 
    { 
     public string Venue { get; set; } 
     public string Date { get; set; } 
     public string Time { get; set; } 
    } 

Nun, um die Änderungen in der Steuerung zu machen, würde ich vorschlagen, dass Sie es wie unten aussehen:

 [Authorize] 
     [HttpPost] 
     public ActionResult Create(EmployeeFormViewModel viewModel) 
     { 
      var _employee = new Employee 
      { 
       Employee = User.Identity.GetUserId(), 
       DateTime = viewModel.DateTime 
      }; 

      _context.Employees.Add(_employee); 
      _context.SaveChanges(); 

      return RedirectToAction("Index", "Home"); 
     } 

und danach gehen zu Ihrem ViewModel und fügen Sie die neue Eigenschaft hinzu, die Sie im Controller hinzugefügt haben (DateTime). Nun sollte Ihr ViewModel wie folgt aussehen:

public class EmployeeormViewModel 
    { 
     public string Venue { get; set; } 
     public string Date { get; set; } 
     public string Time { get; set; } 
     public DateTime DateTime 
     { 
      get 
      { 
       return DateTime.Parse(string.Format("{0} {1}", Date, Time)); 
      } 
     } 
    } 

Ich hoffe, das löst Ihr Problem.

0

Rich Domain ist der Weg.

public class Employee 
{ 
    public Employee(int id, object date, object time) 
    { 
     Id = id; 
     DateTime = DateTime.Parse(string.Format("{0} {1}", date, time)) 
    } 

    public int Id { get; protected set; } 
    public DateTime DateTime { get; protected set; } 
} 

Und sie:

[Authorize] 
[HttpPost] 
public ActionResult Create(EmployeeFormViewModel viewModel) 
{ 
    _context.Employees.Add(new Employee(User.Identity.GetUserId(), viewModel.Date, viewModel.Time)); 
    _context.SaveChanges(); 

    return RedirectToAction("Index", "Home"); 
} 
+1

'Objekt' für Datum und Uhrzeit? Was ist das, .NET 1.0? –

+0

Ich wusste nicht, welche Typen Sie in ViewModel.Date und ViewModel.Time verwendet, also habe ich Objekt verwendet. – gnllucena

1

Um eine andere Perspektive zu bieten, würde ich vorschlagen, Sie könnten es in eine Erweiterungsmethode setzen. Das Konzept der Kombination von Datum und Uhrzeit Zeichenfolgen nicht wirklich das Gefühl, dass es zu Ihrem Domänenmodell gehören sollte, fühlt es sich wie eine generische Sache, die Sie möglicherweise in Ihrer Anwendung (oder sogar in anderen Anwendungen) verwenden möchten. Ich würde dies tun ...

public static class DateTimeExtensions 
{ 
    public static DateTime ParseToDateTime(this string date, string time = null) 
    { 
    return string.IsNullOrEmpty(withTime) ? DateTime.Parse(date) : DateTime.Parse($"{date} {time}"); 
    } 
} 

Und in der Steuerung ...

[Authorize] 
[HttpPost] 
public ActionResult Create(EmployeeFormViewModel viewModel) 
{ 
    var _employee = new Employee 
    { 
     Employee = User.Identity.GetUserId(), 
     DateTime = viewModel.Date.ParseToDateTime(viewModel.Time) 
    }; 

EDIT: Zusätzlich ... etr ‚s Antwort zu übernehmen, die auch ein guter Ansatz ist, könnten Sie verbinden die beiden ...

public class EmployeeormViewModel 
    { 
     public string Venue { get; set; } 
     public string Date { get; set; } 
     public string Time { get; set; } 
     public DateTime DateTime 
     { 
      get 
      { 
       return Date.ParseToDateTime(Time); 
      } 
     } 
    } 
0

I starken Typ Bindung und eine Post-Methode wie folgt Stellung:

public ActionResult Create(EmployeeFormViewModel viewModel) 
{ 

    viewModel.Post(User.Identity.GetUserId()); 
    _context.Employees.Add(_employee); 
    _context.SaveChanges(); 

    return RedirectToAction("Index", "Home"); 
} 

Die Modellansicht wie folgt aussehen:

public class EmployeeFormViewModel 
{ 
    Employee Employee { get; set; } 
    DateTime Date { get; set; } 
    DateTime Time { get; set; } 
    public void Post(int empid) 
    { 
     Employee= new Employee 
     { 
      EmployeeID = empid, 
      DateTime = DateTime.Parse(string.Format("{0} {1}", Date, Time)) 
     }; 
     return; 

    } 
} 

Dies alles ist möglich wegen der schönen MVC Binding-Engine, die die EmployeeFormViewModel auf Abfrage-Strings, vor dem Aufruf der Aktionsmethode basiert erzeugt.

Ich legte eine "Post" -Methode in alle meine ViewModels und lassen MVC die Arbeit machen.

Verwandte Themen