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

Dav*_*eer 26 c# asp.net-mvc design-patterns

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

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

  2. 控制员:"嗯,检查了他的证书,他被允许这样做......嘿,模特,我希望你让我成为第一个人"

  3. 型号:"第一个人......得到它.回到你身边,控制器."

  4. 控制器:"在这里,我将收集新的数据集.回到你身边,查看."

  5. 查看:"很酷,我现在将向用户展示第一个人."

视图:

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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

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

            return returnValue;

        }

        public bool checkPermissions()
        {
            return true;
        }
    }
Run Code Online (Sandbox Code Playgroud)

模型:

public class model
    {
        public string getFirstPerson()
        {
            return "Bill Smith";
        }
    }
Run Code Online (Sandbox Code Playgroud)

Jim*_*dra 6

嗯......我不确定我是否会调用这个MVC ......与ASP.NET WebForm一样,这种形式更像是MVP模式.

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

在经典的MVC模式中,模型一旦实例化,将链接到View,当模型更改时,视图将被通知(可能通过Observer/PubSub模式).

View中的按钮点击等将被路由到控制器,控制器将协调这些类型的东西.

看:这个.


Kei*_*ith 6

我会更像这样描述MVC:

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

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

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

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

我认为它可能有点困惑,因为在许多模型实现(例如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;
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

  2. 从动作获取结果的东西(PersonAction在上面的示例中)并找到要显示的正确视图.在这个例子中,它将打开一个PersonDetailView表单并将Person模型传递给它.

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