2016-06-29 63 views
2

我有一個控制器用於保存數據庫中的數據。控制器類似如下:從ASP.NET MVC控制器中刪除功能

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

我想刪除這行代碼

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

,爲了保持清潔控制器讓這個計算別處。 這是最好的方法來存檔這個?

+0

您是否考慮將該代碼移動到Employee的構造函數中,並且只是說'var_employee = new Employee(User.Identity.GetUserId,viewModel.Date,viewModel。時間)'並解析它? –

+0

創建一個將視圖模型數據映射到實體實例的數據映射器類。 –

回答

4

從數據給我看,你已經使用了一個名爲視圖模型來EmployeeFormViewModel從模型saperate邏輯。我猜想,你的視圖模型看起來像下面的東西:現在

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

,爲了使控制器的變化,我建議你使它看起來象下面這樣:

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

,之後去添加到您的ViewModel並添加您添加到控制器中的新屬性(DateTime)。現在你的ViewModel應該如下圖所示:

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

我希望這可以解決你的問題。

0

富域是方式。

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

而且他們:

[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

日期和時間'對象'?這是什麼,.NET 1.0? –

+0

我不知道你在viewModel.Date和viewModel.Time中使用了什麼類型,所以我使用了object。 – gnllucena

1

爲了提供一個不同的視角,我建議你可以把它放在擴展方法。組合日期和時間字符串的概念並不真的覺得它應該屬於您的域模型,它感覺像您可能希望跨應用程序(甚至在其他應用程序)中使用的通用事物。我會做到這一點...

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

和Controller ...

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

編輯:此外...納入etr的答案,這也是一個很好的方法,你可以將二者結合起來...

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

我喜歡強類型的結合和Post方法如下:

public ActionResult Create(EmployeeFormViewModel viewModel) 
{ 

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

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

視圖模型看起來像這樣:

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; 

    } 
} 

這一切都是可能的,因爲好的MVC綁定引擎,它,調用操作方法之前,基於查詢字符串的EmployeeFormViewModel的。

我在我的所有ViewModels中放置了「Post」方法,並讓MVC完成這項工作。