Model view controller MVC:我做得对吗?

Model view controller MVC:我做得对吗?,model-view-controller,Model View Controller,大家好。我不知道我是否100%理解MVC的概念 我在模型-视图关系方面遇到问题 为了向用户显示数据,视图必须能够访问数据,对吗? 这种访问是通过将所有需要的数据直接传递给视图(并使视图将数据作为属性保存在其类中)来实现的,还是通过将数据“解析”为字符串、整数等来实现的。。。根据需要(当用户在GUI中导航时)从控制器发出事件?我觉得这有点过分,因为数据没有改变 顺便说一句,你能告诉我维基百科上MVC图表上的箭头在一个真实的例子中做了什么吗?谢谢。视图仅用于演示目的。控制器负责处理来自UI的请求,并

大家好。我不知道我是否100%理解MVC的概念

我在模型-视图关系方面遇到问题

为了向用户显示数据,视图必须能够访问数据,对吗? 这种访问是通过将所有需要的数据直接传递给视图(并使视图将数据作为属性保存在其类中)来实现的,还是通过将数据“解析”为字符串、整数等来实现的。。。根据需要(当用户在GUI中导航时)从控制器发出事件?我觉得这有点过分,因为数据没有改变


顺便说一句,你能告诉我维基百科上MVC图表上的箭头在一个真实的例子中做了什么吗?谢谢。

视图仅用于演示目的。控制器负责处理来自UI的请求,并调用模型中必要的方法,然后将它们的输出显示给视图


箭头表示类之间的关系。虚线表示类和接口之间的关系,实线表示直接关系,这意味着类可能包含与其相关的类的实例变量。

模型是中心的权威信息库。以教堂的会众名录为例

该模型中有控制器,用于通知模型应更改的数据。例如,当教会成员移动或更改电话号码时,他们会通知教会办公室,并更新目录

该模型中还有使用数据的视图,但无法对其进行更改。例如,一个教会成员可以从目录中获取另一个教会成员的信息

请注意,在某些情况下,视图和控制器可以是同一个对象,或者一个模型的视图、另一个模型的控制器等。例如,教堂成员可以是其他成员数据的视图,或者通过与模型交互来更改自己的视图

需要记住的重要一点是谁拥有数据的权威版本。模型具有最及时、最准确和最权威的数据这一不变量意味着您确切地知道从何处获取所需的信息


模型和视图通信有两种基本方式:推式和拉式。推送数据涉及模型端的智能,以了解在更新信息时应通知哪些视图。提取数据涉及到视图方面的智能,以了解如何以及何时查看模型,以查看它最感兴趣的数据的更改。

我相信我可以增加一点清晰度。基本上,您可以使用一个只存在一个模型实例的单例模式,然后您可以在视图中使用所述单例将视图中的内容绑定到模型,也就是说,您可以为模型的更改(在某种意义上)添加侦听器,并且只要模型更改,视图就会自动更新

模型本身不受视图的直接影响,而是视图分派事件或使用控制器修改模型。通过这种方式,您可以拥有一个公共的“共享”模型,一个公共的控制器,它可以修改所述模型,以及以合理的方式显示所述模型部分的各种视图

视图不需要以这种方式处理彼此之间的数据传递,修改模型的常见功能包含在控制器中。当我第一次深入研究这些概念时,我也遇到了一些问题,主要是因为这些部分从来没有100%的真正分离,它们都是相关的,并且会相互引用(至少通过附加的侦听器)


在所选的Flex/AS3 my dev环境中,这非常容易实现,您可以在Model.as文件中创建一个名为say modelLocator的静态变量,该变量本身就是一个新的Model(),在Model.as中定义所有公共变量,在Controller.as中创建一个属性来控制模型(当然这里也可以称之为modelLocator)并且在控制器的构造函数中可以实例化modelLocator,比如modelLocator=Model.modelLocator,在视图中执行相同的操作,然后在视图中,当模型更改时,只需更新视图组件(在Flex中,可以使用{}要将值直接绑定到组件的属性上,请根据@fbereto的帖子从模型中提取视图(顺便说一句,解释得很好).

从高层次的角度来看,当您考虑应用程序体系结构,即数据层、业务逻辑层和表示层时,MVC应该只是您的表示层。我经常看到人们错误地认为,在MVC中,模型代表他们的数据层,控制器代表业务逻辑层,视图代表在表示层中添加新的元素

您应该始终有一个单独的业务逻辑层(或服务层),MVC控制器可以访问该层来执行业务逻辑,还应该有一个单独的数据访问层(或存储库),只有服务/业务逻辑层可以访问该层来从数据库中检索数据

在典型的MVC应用程序中,可能有多个视图模型表示同一数据层对象(通常表示一个数据库表)。例如,您可能有两个视图来表示有关人员的信息;一个是摘要视图,另一个是详细信息视图。在MVC应用程序中,您将有两个视图模型,即PersonSummary和PersonDetail,这两个模型都是从数据层中的同一个人表中填充的,当您r控制器调用PersonService类(业务逻辑层)上的方法(例如GetPersonSummary()和GetPersonDetails()

与将视图模型视为数据模型并将所有业务逻辑写入控制器操作相比,以这种方式分层应用程序将使它们更易于维护和测试
public class Car
{
    int Id { get; set; }

    string make { get; set; }
    string colour { get; set; }
}

public class Salesman
{
    int Id { get; set; }

    string name { get; set; }
    IList<Sale> Sales { get; set; }
}

public class Sale
{
    int Id { get; set; }

    int CarId { get; set; }
    int SalesmanId { get; set; }

    decimal Amount { get; set; }
}
public class SalesViewModel
{
    string SalesmanName { get; set; }
    List<Car> CarsSold { get; set; }
}
public ActionResult SalesmanCarsSold(int salesmanId)
{
    SalesViewModel salesVm = new SalesViewModel();

    using (var dbCtx = new dbCtx())
    {
        salesVm.SalesmanName = dbCtx.GetSalesmanById(salesmanId).Name;
        salesVm.CarsSold = dbCtx.GetCarsSoldBySalesmanId(salesmanId);
    }

    return View(salesVm);
}
@model MyProject.Web.Models.ViewModels.SalesViewModel

Salesman Name: @Model.SalesmanName

@foreach(var car in Model.CarsSold)
{
    Car: @car.make
}