为什么控制器首先在ASP中运行.净MVC

本文关键字:运行 MVC ASP 控制器 为什么 | 更新日期: 2023-09-27 18:06:44

我想改进当前的ASP. net实现。。NET MVC框架。当前代码:

routes.MapRoute(null, "I-want-to-fly", new { controller = "Airport", action = "Fly" });
public class AirportModel 
{
   public List<Plane> Planes { get; private set; }
   public List<Pilot> Pilots { get; private set; }
   public void AddFly(Plane plane, Pilot pilot, Passenger passenger)
   {
        // . . .
   }
}
public class AirportController
{
   private AirportModel model;
   [HttpGet]
   public ViewResult Fly(string from, string to)
   {
       var planes = return (from p in model.Planes 
                            where p.CityFrom == from && p.CityTo == to
                            select p).ToList();
       return View(planes);
   }
   [HttpPost]
   public ActionResult Fly(Plane plane, Passenger passenger, DateTime time)
   {
       if (!(ModelState.IsValid && plane.TimeOfDeparture == time))
            return View();
       var pilot = (from p in model.Pilots 
                    where p.Free && p.CanAviate(plane.Id) 
                    select p).First();
       model.AddFly(plane, pilot, passenger);
       return RedirectToAction("Succeed");
   }
}

我的建议:

routes.MapRoute(null, "I-want-to-fly", new { model = "Airport", action = "Fly" });
public class AirportModel 
{
    private List<Plane> planes;
    private List<Pilot> pilots;
    private void AddFly(Plane plane, Pilot pilot, Passenger passenger)
    {
        // . . .
    }
    [HttpGet]
    public ViewResult Fly(string from, string to)
    {
        var planes = return (from p in model.Planes 
                             where p.CityFrom == from && p.CityTo == to
                             select p).ToList();
        return View(suitablePlanes);
    }
    [HttpPost]
    public ActionResult Fly(Plane plane, Passenger passenger, DateTime time)
    {
        if (!(ModelState.IsValid && new PlaneController().CanFly(plane, time)))
                return View();
        var pilot = (from p in pilots 
                     where p.Free && p.CanAviate(plane.Id) 
                     select p).First();
        AddFly(plane, pilot, passenger);
        return RedirectToAction("Succeed");
    }
}
public static class PlaneController
{
    public static bool CanFly(Plane plane, DateTime time)
    {
        return plane.TimeOfDeparture == time; // it will be more complex
    }
}

你看,这样我们就不需要过多的控制器和它们的方法。模型只能通过强制创建控制器:主要是为了验证用户输入(不是输入验证,是业务验证)

你怎么看,这个想法能延续下去吗?或者,它有什么问题?

谢谢你的回复!

UPDATE:我注意到,由于改变模型的状态(大部分),我们需要替换控制器和视图的实现。那么,如果模型导致改变实现,为什么模型不能呢?

UPDATE 2:我好像解释错了。我不想让模特做所有的工作,当然不!我试着说,不是控制器应该决定如何处理模型和什么视图最适合这个用户请求。

是不是很奇怪,那个模型不知道如何可视化自己,但是某个控制器知道?

不奇怪,我们需要控制器的GET请求,那里没有什么要控制的?

我试图消除这些陌生感。

UPDATE 3:我明白它不能在任何地方应用。主要的问题是:它能改进当前MVC实现的某些部分吗?我最感兴趣的是ASP。. NET MVC——我们可以

  1. 删除冗余控制器或它的一些方法
  2. 直接使用模型

使用这个想法?这可能吗?这个想法有什么问题?

发现问题:

  1. 模型和视图/控制器之间更强的连接 -但目前我不认为这是一个问题。实际上,它显示视图和控制器是在帮助中为主元素model创建的。

UPDATE 4:我更改了代码,显示"before/after"。也许这个例子会更好。

为什么控制器首先在ASP中运行.净MVC

这是不是违背了MVC的整个理念?你的模型与你的控制器和视图是分离的。通过这种方式(你建议的方式),你将无法用另一个实现取代你的模型,或者你的控制器。

更新我:

你当然可以让你的模型做控制器的部分,但从那一刻起,你不再谈论MVC设计模式了。对于MVC,模型现在不应该也不应该关注视图。这是控制器的工作。

控制器接收用户输入并通过调用模型对象发起响应。控制器接受来自用户的输入,并指示模型和视口根据该输入执行操作。

在MVC模式中,模型不只是固定到您的数据库模型,它也可以是您的数据库模型和存储库模式的组合,您可以在其中实现业务逻辑。

我看到你的建议最大的问题是它使代码不可重用。我得到了一个与视图紧密耦合的模型如果我想以任何我想要的方式重用这个模型我真的不想要。


更新二

  • 我认为你被Controller这个词误导了,我有这个想法一段时间了,你最近的评论为我证实了这一点

    控制器是一些对象,用于检查用户输入与业务逻辑的对应关系。

    控制器对用户输入起作用,它们可能会检查用户输入,但它们检查有效性的责任到此为止。业务逻辑放在模型中(同样,模型是由MVC模式定义的,而不是数据模型中的模型)。它们的主要目的是决定显示什么视图。

  • 也是你最近的评论之一:

    你认为如果按照我的方式开发[asp.net mvc],会不会解决控制器冗余的问题?

    Asp。Net MVC遵循MVC设计模式。你的提议没有。它看起来更像是一个ModelControlled View模式,只是为了创造一个名称。此外,没有冗余的控制器,控制器没有问题,它们是解决方案的一个组成部分。

以及用代码示例简单地阐明我的意思的努力:

namespace DataProject.Model
{
    public class AirportModel 
    {
        public List<Plane> Planes { get; set; }
        public List<Pilot> Pilots { get; set; }
        public List<Passenger> Passengers { get; set; }
        public List<Flight> Flights { get; set; }
    }
}
namespace SomeProject.Repository
{
    public class AirportRepository
    {
        private DataProject.Model.AirportModel model;
        //constructor sets the model somehow
        public bool AddFlight(Plane plane, List<Passenger> passengers, DateTime time)
        {
            //Business logic
            if (plane.TimeOfDeparture != time) return false;
            var pilot = (from p in model.Pilots 
                         where p.Free && 
                               p.CanAviate(plane.Id) 
                         select p).FirstOrDefault();
            //More Business logic
            if (pilot == null) return false;
            //Add plane, pilot and passenger to database
            model.Flights.add(new Flight{Pilot = pilot, Plane = plane, Passengers = passengers});
            //Even here you could decide to do some error handling, since you could get errors from database restrictions
            model.Save(); 
            return true;    
        }
        public List<Planes> GetPlanes(string from, string to)
        {
            return (from p in model.Planes 
                        where p.CityFrom == from && p.CityTo == to
                        select p).ToList();
        }
    }
}
namespace MVCApp.Controllers
{
    public class AirportController
    {
        private SomeProject.Repository.AirportRepository repository;
        [HttpGet]
        public ViewResult Fly(string from, string to)
        {
            var viewModel = repository.GetPlanes(from, to);
            return View(viewModel);
        }
        [HttpPost]
        public ActionResult Fly(Plane plane, List<Passenger> passengers, DateTime time)
        {
            if (!ModelState.IsValid) return View(); 
            if (!repository.AddFlight(plane, pilot, passenger)) return View();
           return RedirectToAction("Succeed");
        }
    }
}

无意冒犯,但这究竟是一种改进吗?

所以你做了一个叫做PersonModel的类,它根本没有真正做"建模的事情"——它在做控制器做的工作——你让它处理get和posts并调用视图的显示,然后你有一个静态的"控制器",它真的不控制任何东西,它自己与业务逻辑有关。说实话,我不明白这有什么好。

一个具体的例子是,你有一个控制器检查是否Age >= 18,这是一个非常"业务规则"的事情,控制器要做。这不是控制器的目的。这就是模型对象的工作——关注业务逻辑之类的事情。正如一个人所说,控制器更像是一个电子管理员。在您的示例中,您已经将其降级为远不如策展人的角色。

对象在MVC应用程序中扮演着不同的角色。视图向我们展示东西,并为我们提供与应用程序交互的方式。控制器处理来自视图的输入,并提供所需的视图。模型提供了放置数据以及模型所包含的逻辑和业务规则的位置。服务处理诸如将数据持久化到某个存储(如数据库)之类的事情。

你可以在没有控制器的情况下在一个类中完成所有操作,但你需要"关注点分离"因此控制器负责http请求和验证,而模型只负责数据。

你是程序员,那么你可以同意或不同意MVC模式但是你描述的模式不支持关注点分离它打破了MVC的整个思想

与MVC无关

这是'MVNothing'

:)开个玩笑 *_^