我第一次尝试MVC。我试图实现一个简单的示例。来自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";
}
}
答案 0 :(得分:6)
嗯......我不确定我是否会调用此MVC ......与ASP.NET WebForm一样,此表单更像是MVP模式。
根据我的理解,在MVC中,控制器是负责管理所有资源和代码流的人。在您的示例中,您基本上首先创建一个Windows窗体(视图),然后将控制器附加到它,这更像是一种MVP。
在经典的MVC模式中,模型一旦被实例化,就会链接到View,当模型发生变化时,视图将被通知(可能通过Observer / PubSub模式)。
来自View的按钮点击等将被路由到控制器,控制器将协调那些类型的东西。
请参阅:this。
答案 1 :(得分:6)
我会更像这样描述MVC:
请求(MVC网址路由,某些事件从以前的网址传递过来等)
控制器 - 检查凭据,获取数据,返回模型
模型 - 表示从Controller传回的数据
查看 - 渲染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;
}
}
这个例子缺少的是使这一切成为可能的框架 - 有两个重要部分:
接受/解析参数并基于该参数调用控制器的操作方法。例如在Asp.net MVC中这是路由处理程序 - 上面的调用将是请求url:〜/ Person / Detail / personId
取得操作结果的内容(上例中的PersonAction
)并找到要显示的正确视图。在此示例中,它会打开PersonDetailView
表单并将Person
模型传递给它。
WinForms的MVC实现有很多示例框架 - 其中一个可能是一个很好的起点。
答案 2 :(得分:1)
要采用MVC模式,您需要实现以下内容:
我同意Jimmy您希望将类似Observer模式的内容集成到此类系统中,以便模型可以在View发生变化时通知View,以便View可以相应地更新自己。
与MVP的区别在于它引入了一个Presenter类,它代表View监视Model,换句话说,View不知道Model,它只知道它的Presenter。 Presenter响应模型中的更改并相应地更新视图。
答案 3 :(得分:1)
我认为你的叙述有一些更正。严格来说,视图不与控制器联系,用户直接联系控制器。在Web应用程序中,它看起来像这样。
用户:嗨网络应用,我可以将资源放在/ people / 1
路由引擎:这意味着你是人控制器。得到第一个用户。
用户控制器:型号,我需要您为经过身份验证的用户提供用户记录,并为第一个人提供人员记录。
用户控制器:对。我知道经过身份验证的用户是管理员,而人员确实存在。因此,请将人员的管理员视图返回给用户。
渲染引擎:从视图(模板)和人物对象(数据)构建html
这在webforms中很难做到。我想最好的方法是为每个控制器创建一个页面,并让该页面动态选择并显示用户控件。每个视图一个。在MVC中重要的是视图是愚蠢的。所有请求都由控制器直接处理,然后控制器选择要使用的视图。
答案 4 :(得分:0)
您的checkPermissionsAndGetFirstPerson
方法可能做得太多了。授权和获取数据应该是单独的操作。
此外,如果您的Form1
类是您的视图,则可能不应该构建控制器。这似乎是倒退。
您在.NET中的MVC上找到的大多数信息都适用于ASP.NET MVC Web应用程序。您可能想查看CodePlex上的WinFormsMVC项目,以了解其他人如何解决此问题。
http://winformsmvc.codeplex.com/
这是CodePlex上的另一个WinForms MVC实现。看起来它有更多的文档。
答案 5 :(得分:0)
您可能会发现本教程非常有用:http://nerddinnerbook.s3.amazonaws.com/Intro.htm。由Scott Guthrie撰写,它很好地解释了MVC工作流程。第4部分应该有你正在寻找的基础知识。