MVC C# - 最简单的实现

Posted

技术标签:

【中文标题】MVC C# - 最简单的实现【英文标题】:MVC C# - Simplest Possible Implementation 【发布时间】:2010-11-09 14:43:00 【问题描述】:

我第一次尝试 MVC。我正在尝试实现一个 simple 示例。灵感来自here。我有这个模式吗(现在!)?

    视图:“嘿,控制器,用户刚刚告诉我他想要第一人称”

    管制员:“嗯,在检查了他的凭据后,他可以这样做……嘿,模特,我希望你让我成为第一人称”

    模型:“第一人称……知道了。还给你,控制器。”

    控制器:“在这里,我将收集新的数据集。返回给你,查看。”

    视图:“酷,我现在向用户展示第一个人。”

查看:

namespace WinFormMVC

    public partial class Form1 : Form
    
        controller cont = new controller();

        public Form1()
        
            InitializeComponent();
        

        private void button1_Click(object sender, EventArgs e)
        
            textBox1.Text = cont.checkPermissionsAndGetFirstPerson();
        
    

控制器:

public class controller
    
        public string checkPermissionsAndGetFirstPerson()
        
            string returnValue = "";
            if (checkPermissions())
            
                model m = new model();
                returnValue =  m.getFirstPerson();
            

            return returnValue;

        

        public bool checkPermissions()
        
            return true;
        
    

型号:

public class model
    
        public string getFirstPerson()
        
            return "Bill Smith";
        
    

【问题讨论】:

【参考方案1】:

您的checkPermissionsAndGetFirstPerson 方法可能做得太多了。授权和获取数据应该是独立的操作。

另外,如果您的 Form1 类是您的视图,那么它可能不应该构建控制器。这似乎倒退了。

您将在 .NET 中找到有关 MVC 的大多数信息将用于 ASP.NET MVC Web 应用程序。您可能想查看 CodePlex 上的 WinFormsMVC 项目,看看其他人是如何解决这个问题的。

http://winformsmvc.codeplex.com/

这是 CodePlex 上的另一个 WinForms MVC 实现。看起来它有更多的文档。

http://koosserymvcwin.codeplex.com/

【讨论】:

啊……是的,Form1 类是我的观点。所以如果不应该构造控制器,它应该如何工作?这正是我想要理解的:-)【参考方案2】:

嗯...我不确定是否将其称为 MVC...与 ASP.NET WebForm 一样,此表单更像是 MVP 模式。

据我了解,在 MVC 中,控制器负责管理所有资源和代码流。在您的示例中,您基本上首先创建了一个 Windows 窗体(视图),然后将一个控制器附加到它上面,这更像是一种 MVP 类型的东西。

在经典的 MVC 模式中,模型一旦实例化,就会链接到视图,当模型发生变化时,视图会得到通知(可能通过观察者/发布订阅模式)。

来自视图的按钮点击等将被路由到控制器,该控制器将协调这些东西。

见:this。

【讨论】:

Jimmy - 非常感谢.. 在这个例子中我将如何实例化模型? Win Form 自带 program.cs。您可以在其中实例化您的控制器类并要求它创建您的视图? :) Cheers Jimmy...已经尝试过了。如果在 program.cs 中创建控制器,则从视图中引用控制器时遇到问题。嗯,您能演示一下代码吗? 嗯...代码示例有点长,请查看cid-9ce3c99ed4a9933e.skydrive.live.com/self.aspx/.Public/…。基本上,您的示例已修改以适合我对 MVC 在 WinForm 环境中的外观的“看法”。一些代码可以改进(即不是线程安全的),但为了简单的例子,我省略了这些。它还将演示 View 和 Model 如何通过 Pub/Sub / eventing 进行交互。这是一个 VS2010 解决方案,您可能需要先将其转换为 VS2008。我正在使用一些 .NET 3.5 的东西,所以它不会在 VS2005 上运行。 其他需要注意的事项:Program.cs,我在那里实例化了一个控制器并将其视图传递给 Application.Run(即期待一个 Form 实例)。我通常将公共接口放在一个公共位置 (dll) 以打破循环引用,但为了简单起见,我在这个示例中没有这样做。相反,所有接口都放置在文件夹结构内以对齐命名空间。忘记将它们移动到 Common 文件夹中。请注意,Employee 类提供了一个事件,因此任何可能对任何属性更改感兴趣的代码都可以得到通知(pub/sub/observer)【参考方案3】:

要采用 MVC 模式,您需要实现以下内容:

视图连接到模型并监听变化。 控制器连接到视图并处理特定事件,例如按钮按下等 模型处理控制器发出的请求并通知视图。

我同意 Jimmy 的观点,您希望将类似 Observer 模式的东西集成到这种类型的系统中,这样模型就可以在视图发生变化时通知视图,以便视图可以相应地更新自己。

MVP 的不同之处在于它引入了一个 Presenter 类,它代表 View 监视 Model,换句话说,View 不知道 Model,它只知道它的 Presenter。 Presenter 响应模型中的变化并相应地更新视图。

【讨论】:

干杯詹姆斯..我得到了理论(我认为)..现在只是想得到工作代码! 我认为通过您的问题示例的外观,您确实了解它的工作原理以及视图/控制器和模型之间的关系。您可能会做的最简单的示例是创建一个基本视图,无论它是表单/网页还是其他任何东西,并放置一个标签和一个按钮。然后创建一个控制器类来处理按钮的点击事件。然后创建一个模型类,它将简单地返回一个指示按钮被按下的字符串。所以流程应该是用户 -> 点击按钮 -> 控制器 -> 告诉模型 -> 模型做某事 -> 视图 -> 更新自己。 所以你真正要做的是让模型实现 ISubject(查看主题模式)和视图来实现 IObserver(查看观察者模式)。然后,模型应该实现一个名为 Update 的方法,该方法将在发生重大变化时通知所有观察者(在本例中为视图)。这些更改应该包含某种引用(可能是已更新的数据/对象)和一个定义发生了哪种更改的指示符,即(UserDeleted、UserAdded、UserUpdated)。希望对您有所帮助。【参考方案4】:

您可能会发现本教程非常有帮助:http://nerddinnerbook.s3.amazonaws.com/Intro.htm。它由 Scott Guthrie 撰写,很好地解释了 MVC 工作流程。第 4 部分应该包含您正在寻找的基础知识。

【讨论】:

感谢 synhershko.. 我正在尝试先构建最简单的实现,然后可以去使用框架。 不确定您所说的“框架”是什么意思。该教程将指导您了解模型、视图和控制器,在构建简单应用程序时解释所有基础知识。 MVC 和 ASP.NET 是那里使用的唯一框架(以及 LINQ 作为工具,但这是可选的 - 如果需要,您可以使用标准 DAL)。【参考方案5】:

我会更像这样描述 MVC:

    请求(MVC url 路由,从以前的 UI 传递的某些事件等)

    控制器 - 检查凭据、获取数据、返回模型

    Model - 表示从 Controller 传回的数据

    View - 渲染控制器返回的模型。根据模型可能会显示 UI 以初始化新的控制器操作。也可以将模型传回给下一个控制器操作。

我认为这可能有点混乱,因为在许多 Model 实现(例如 Linq)中,它们提供数据定义和访问,但仍然是 Controller 知道从哪里开始(即使它是 Model 知道如何保存它的自己的变化)。

所以,你的代码应该是这样的:

//Controller:
public class PersonController

    public PersonAction Detail(int personId)
    
        Person returnValue;
        //get person from DB and populate returnValue
        return new PersonAction( returnValue );
    


//Model:
public class Person

    public string FirstName get; set;
    public string LastName get; set;


//View:
public partial class PersonDetailView : MVCForm<Person>

    public Form1( Person model ):base(model) 
        textBox1.Text = model.FirstName + " " + model.LastName;
    

    private void button1_Click(object sender, EventArgs e)
    
        textBox1.Text = model.FirstName + " " + model.LastName;
    

这个例子缺少的是使这一切成为可能的框架 - 有两个重要部分:

    接受/解析参数并基于此调用控制器的操作方法的东西。例如,在 Asp.net MVC 中,这是路由处理程序 - 上面的调用将是请求 url:~/Person/Detail/personId

    从操作中获取结果(上例中的PersonAction)并找到要显示的正确视图。在本例中,它将打开一个PersonDetailView 表单并将Person 模型传递给它。

有很多用于 WinForms 的 MVC 实现的示例框架 - 其中一个可能是一个很好的起点。

【讨论】:

嗨基思..非常感谢。一直在玩你的代码,但还没有完全理解,也没有得到它的工作。理想的情况是,如果您可以将上面的代码填写到可以编译的内容中。我的大脑很痛.. 尝试得到这个非常有趣:-)【参考方案6】:

我认为您的叙述需要进行一些更正。严格来说,视图不联系控制器,用户直接联系控制器。在网络应用中,它看起来像这样。

    用户:嘿,网络应用程序,我可以在 /people/1 获得资源

    路由引擎:这意味着您是个人控制器。获取第一个用户。

    用户控制器:模型,我需要您获取已验证用户的用户记录和第一人的人员记录。

    用户控制器:正确。我知道经过身份验证的用户是管理员,并且确实存在一个人。因此,将 person 的 Admin 视图返回给用户。

    渲染引擎:从视图(模板)和人物对象(数据)构建 html

这在网络表单中很难做到。我想最好的方法是为每个控制器设置一个页面,并让该页面动态选择并显示用户控件。每个视图一个。在 MVC 中,视图是愚蠢的这一点很重要。所有请求都由控制器直接处理,然后控制器选择要使用的视图。

【讨论】:

JayArr.. 谢谢。实际上,我对 Web 方面的事物更感兴趣.. 使用 Web 表单使事情变得更简单(咧嘴笑)。如果你有时间在 asp.net 中放置一个超级简单的 MVC 演示,它展示了数据的概念和流程,那将是很棒的。不使用框架:-)

以上是关于MVC C# - 最简单的实现的主要内容,如果未能解决你的问题,请参考以下文章

C#(ASP.NET) MVC kendo grid如何绑定一个数据库返回的datatable(要最简单的)

php实现最简单的MVC框架实例教程

C#实现一个最简单的HTTP服务器

C#跨线程操作控件的最简单实现探究

c# 中最简单的 IDisposable 模式是啥? [复制]

用最基本的EF+MVC+JQ+AJAX+bootstrap实现权限管理的简单实例 之登陆和操作权限