从ASP中删除功能..NET MVC控制器

本文关键字:NET MVC 控制器 功能 删除 ASP | 更新日期: 2023-09-27 17:53:07

我有一个控制器,用于在数据库中保存数据。控制器如下所示:

[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))

,并在其他地方进行计算,以保持控制器干净。哪一种是最好的存档方式?

从ASP中删除功能..NET MVC控制器

从给定的数据中,我看到您使用了一个名为EmployeeFormViewModel的ViewModel来将逻辑从模型中分离出来。我猜你的ViewModel看起来像下面的东西:

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

希望这能解决你的问题。

为了提供不同的视角,我建议您可以将其放在扩展方法中。组合日期和时间字符串的概念感觉不应该属于您的领域模型,它感觉像是您可能希望在应用程序中(甚至在其他应用程序中)使用的通用事物。我会这样做…

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

在控制器中…

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

富域就是这样。

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

我喜欢强类型绑定和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,在调用动作方法之前。

我把一个"Post"方法在我所有的ViewModels和让MVC做的工作。