Asp.net mvc 哪种代码更适合MVC方法?在控制器或视图模型中放置代码?

Asp.net mvc 哪种代码更适合MVC方法?在控制器或视图模型中放置代码?,asp.net-mvc,Asp.net Mvc,我已经读到,在MVC应用程序中,应该保持控制器“精简”。但是,当我在ViewModel中输入获取数据的代码时,我觉得定位起来不那么直观,这意味着在排除故障时,我通常会首先查看控制器(或者这可能是我真正的问题)。我还发现,如果您通过控制器传递数据,您可以将同一个VM用于许多不同的事情 我是否违反了一些大原则或导致了性能问题 例如,将这些伪代码段与两种方法进行比较,这两种方法似乎都能很好地工作: 假设一个名为repositoryy的存储库,其方法GetCourses()用于获取课程列表 1) Vie

我已经读到,在MVC应用程序中,应该保持控制器“精简”。但是,当我在ViewModel中输入获取数据的代码时,我觉得定位起来不那么直观,这意味着在排除故障时,我通常会首先查看控制器(或者这可能是我真正的问题)。我还发现,如果您通过控制器传递数据,您可以将同一个VM用于许多不同的事情

我是否违反了一些大原则或导致了性能问题

例如,将这些伪代码段与两种方法进行比较,这两种方法似乎都能很好地工作:

假设一个名为repositoryy的存储库,其方法GetCourses()用于获取课程列表

1) ViewModel获取数据,控制器指示流量:

public CourseViewModel
{
    private MyProjectEntities db = new MyProjectEntities();
    Repository repository = new Repository();
    {
     public CourseViewModel()
        {
          Courses = db.Course.ToList();
        }
    public List<Course> Courses {get; set;}
    }
}

public class CourseController : Controller
    {
    public ActionResult Index()
    {
     var courseviewmodel = new CourseViewModel();
     return View(courseviewmodel);
    }
}
公共课程视频模型
{
私有MyProjectEntities db=新的MyProjectEntities();
Repository Repository=新存储库();
{
公共课程视频模型()
{
Courses=db.Course.ToList();
}
公共列表课程{get;set;}
}
}
公共类课程控制器:控制器
{
公共行动结果索引()
{
var courseviewmodel=新courseviewmodel();
返回视图(CourseView模型);
}
}
2) 控制器获取数据,传递到ViewModel,然后传递到视图:

public CourseViewModel
{
     public List<Course> Courses {get; set;}
}


public class CourseController : Controller
{
    public ActionResult Index()
    {
     var courseviewmodel = new CourseViewModel();
     courseviewmodel.Courses  = repository.GetCourses.ToList();
     return View(courseviewmodel);
    }
}
公共课程视频模型
{
公共列表课程{get;set;}
}
公共类课程控制器:控制器
{
公共行动结果索引()
{
var courseviewmodel=新courseviewmodel();
courseviewmodel.Courses=repository.GetCourses.ToList();
返回视图(CourseView模型);
}
}

第二个选项。顺便说一句,没有“更正确的MVc方法”。有MVC的分离,就是这样。第一个选项打破了这种分离,因为视图模型执行控制器的工作,而不是作为保存视图数据的“哑”数据。您不希望将视图模型与模型耦合


不过,在MVVM中,视图模型有点像控制器,但是这种方法最适合桌面AP,而不是web应用。

谢谢,我松了一口气。太多的问题被第一种方法回答为更正确。我想如果VM有代码,测试也会成为一个问题。