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(要最简单的)