MVC C# - 最简单的可能实现

时间:2009-07-10 04:37:28

标签: c# asp.net-mvc design-patterns

我第一次尝试MVC。我试图实现一个简单的示例。来自here的灵感。我有这种模式(还是!)?

  1. 查看:“嘿,控制器,用户只是告诉我他想要第一个人”

  2. 控制器:“嗯,检查了他的证件,他被允许这样做......嘿,模特儿,我希望你能让我成为第一个人”

  3. 模特:“第一个人......得到了。回到你身边,控制器。”

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

  5. 查看:“很酷,我现在会向用户展示第一个人。”

  6. 查看:

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

6 个答案:

答案 0 :(得分:6)

嗯......我不确定我是否会调用此MVC ......与ASP.NET WebForm一样,此表单更像是MVP模式。

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

在经典的MVC模式中,模型一旦被实例化,就会链接到View,当模型发生变化时,视图将被通知(可能通过Observer / PubSub模式)。

来自View的按钮点击等将被路由到控制器,控制器将协调那些类型的东西。

请参阅:this

答案 1 :(得分:6)

我会更像这样描述MVC:

  1. 请求(MVC网址路由,某些事件从以前的网址传递过来等)

  2. 控制器 - 检查凭据,获取数据,返回模型

  3. 模型 - 表示从Controller传回的数据

  4. 查看 - 渲染Controller返回的模型。根据型号,可能会显示UI以初始化新的Controller操作。也可以将Model传递给下一个Controller动作。

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

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

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

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

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

    2. 取得操作结果的内容(上例中的PersonAction)并找到要显示的正确视图。在此示例中,它会打开PersonDetailView表单并将Person模型传递给它。

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

答案 2 :(得分:1)

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

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

我同意Jimmy您希望将类似Observer模式的内容集成到此类系统中,以便模型可以在View发生变化时通知View,以便View可以相应地更新自己。

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

答案 3 :(得分:1)

我认为你的叙述有一些更正。严格来说,视图不与控制器联系,用户直接联系控制器。在Web应用程序中,它看起来像这样。

  1. 用户:嗨网络应用,我可以将资源放在/ people / 1

  2. 路由引擎:这意味着你是人控制器。得到第一个用户。

  3. 用户控制器:型号,我需要您为经过身份验证的用户提供用户记录,并为第一个人提供人员记录。

  4. 用户控制器:对。我知道经过身份验证的用户是管理员,而人员确实存在。因此,请将人员的管理员视图返回给用户。

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

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

答案 4 :(得分:0)

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

此外,如果您的Form1类是您的视图,则可能不应该构建控制器。这似乎是倒退。

您在.NET中的MVC上找到的大多数信息都适用于ASP.NET MVC Web应用程序。您可能想查看CodePlex上的WinFormsMVC项目,以了解其他人如何解决此问题。

http://winformsmvc.codeplex.com/

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

http://koosserymvcwin.codeplex.com/

答案 5 :(得分:0)

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