65.9K
CodeProject 正在变化。 阅读更多。
Home

7 天逐步学习 MVC (Model View Controller) – 第 1 天

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.85/5 (512投票s)

2011年6月8日

CPOL

21分钟阅读

viewsIcon

4183135

正如文章标题所言,学习MVC。所以日程安排很简单,我们将在7天内学习ASP.NET MVC。

MVC 2已经相当老旧,本文也是多年前撰写的。我们建议您从我们全新的“7天逐步学习MVC 5”系列文章开始阅读,链接如下: https://codeproject.org.cn/Articles/866143/Learn-MVC-step-by-step-in-days-Day 

目录

关于作者

简单介绍一下两位作者。Shivprasad Koirala和Sukesh Marla都是专业的MVC培训师,每周六和周日您都可以在孟买安德海(Andheri Mumbai)找到他们,他们每周都教授MVC。

那么,日程安排是什么?

正如文章标题所言,学习MVC;所以日程安排很简单,我们将在7天内学习ASP.NET MVC。

第一天我们将从一个简单的Hello World开始,包括在控制器和视图之间传递数据、HTML辅助类、MVC模型,我们还将创建一个简单的客户数据录入页面。

 

MVC 与 Webforms 与 ASP.NET 词汇

许多开发者认为ASP.NET与MVC是不同的。但实际上它们是相同的。

ASP.NET是微软的一个Web框架,MVC是用于使用MVC架构风格编写代码的Visual Studio代码模板。旧版ASP.NET的正确名称是“ASP.NET WebForms”。所以ASP.NET Webform是带有后台代码的旧版ASP.NET,而MVC是新事物。但它们都使用ASP.NET框架。

所以我们直说,ASP.NET是一个框架,而MVC和Webform是编码风格。MVC是新事物,WebForm是你的旧代码后台风格。

那么为什么选择MVC,它为什么比Webforms更好?

作为一名ASP.NET Webform开发者,在MVC中你将错过许多你喜爱的东西。在MVC中没有后台代码,没有rad服务器控件,没有ViewState,没有ASP.NET页面生命周期等等。所以在初期阶段,你真的很难相信MVC比Webforms更好。所以我建议你观看下面的30分钟视频,以理解为什么MVC比Webform更出色。

MVC的先决条件

在开始这一天之前,请确保您拥有创建MVC应用程序所需的所有“配料”。现在MVC有很多版本:MVC 2、MVC 3、MVC 4和MVC 5。所以根据您使用的版本,您需要相应的Visual Studio版本。

  • 如果您正在使用MVC 5,您需要VS 2013,您可以从http://www.visualstudio.com/en-us/products/visual-studio-express-vs.aspx下载。
  • 如果您正在使用MVC 3和4,您需要VS 2012。http://www.microsoft.com/en-us/download/details.aspx?id=34673
  • 对于MVC 2,您需要VS 2010,2008也可以。

所以一旦你具备了所有先决条件,就可以开始第一个实验了。

实验1:创建一个简单的Hello World ASP.NET MVC应用程序

在本实验中,我们将使用MVC模板创建一个简单的Hello World程序。我们将创建一个简单的控制器,将控制器附加到一个简单的index.aspx页面,并在浏览器上查看显示。

您还可以观看下面的MVC 5视频,它展示了如何在MVC 5中显示一个简单的“HelloWorld”。

步骤1:- 选择项目模板

打开Visual Studio 2013,点击“文件”-->“新建项目”。展开“Visual C#”节点,点击“Web”,然后点击“ASP.NET 应用程序”模板,输入名称和文件夹路径,然后按“确定”。

步骤2:- 选择适当的ASP.NET One选项

MVC 5最大的发展之一是“一个ASP.NET”。如果您查看Visual Studio 2013之前,即VS 2012及更早版本,一旦您选择了MVC或Webforms等编码模板,您就无法更改。您不能在VS 2012中将它们混合使用。因此,如果您使用MVC编码风格启动一个项目,就不能使用Webforms;反之,如果您使用Webforms启动,就不能使用MVC。

如果您好奇想看看VS 2012的结构,可以通过点击IDE中显示的“Visual Studio 2012”菜单来查看。您可以看到我们有不同的模板,如MVC、WebApplication等。一旦您选择了MVC,您就会被它“绑定”,或者一旦您选择了Webforms,您也会被它“绑定”。

而且,从逻辑上讲,WebForm、MVC和WebAPI都在内部使用ASP.NET框架。因此,拥有不同的模板导致了开发人员之间的许多困惑。许多开发人员开始认为ASP.NET与MVC不同,请阅读这篇ASP.NET和MVC的困惑

因此,在VS 2013中,他们将所有模板合并到一个ASP.NET模板中,即“ASP.NET Web 应用程序”,以避免混淆,并且无论您是Webform开发人员还是MVC开发人员,都能获得相同的体验。因此,如果您开始使用MVC,您仍然可以选择使用Webform ASPX视图创建视图。

因此,当您点击“ASP.NET Web 应用程序”时,您会看到所有模板都集中在一个伞形结构下,如下图所示。

请执行以下操作:-

步骤1:- 选择MVC模板,并勾选MVC复选框。如果选择MVC模板,此复选框很可能会被禁用。

步骤2:- 点击“更改身份验证”并将其设置为“无身份验证”。由于这是我们的第一个MVC项目,我们不想涉及身份验证和授权。在第3天,我们将更详细地讨论身份验证。

MVC的好处之一是“单元”测试。因为没有后台代码,控制器变成了简单的类,所以可以非常容易地对控制器进行单元测试。但目前我们将保持此选项未选中,因为我们的主要目的是显示“Hello World”。

让我们花点时间来理解所创建的解决方案。您会注意到的第一件事是创建了许多文件夹,请看下图。

这些文件夹中最重要的是“View”、“Model”和“Controllers”文件夹。MVC架构分为模型、视图和控制器三个部分。

所以第一个请求会到达控制器,它会创建模型和视图的对象,并将最终响应发送给最终用户。

文件夹名称 描述
视图 在此文件夹中,您将添加MVC视图,可以是HTML、Razor或Webform页面。
模型 在此文件夹中,您将添加模型类。模型是简单的.NET类,它们提供数据,并且可能还包含验证。因此,在此文件夹中,您将添加Customer类、Supplier类等。
控制器 (Controller) 在此文件夹中,您将添加控制器,控制器可以有动作。此组件负责接收最终用户的请求,调用相应的动作,创建模型对象,然后将视图和模型绑定在一起,以响应的形式发送结果。
其他文件夹
脚本 在这里添加您的javascript文件。默认情况下,您会找到Jquery和Angular javascript文件,因为它们由Visual Studio本身包含。
App_Start 在MVC应用程序上线之前,它需要激活和初始化许多对象。例如,路由、捆绑和缩小组件等。目前您无需担心此文件夹,我们稍后将讨论每个对象。例如,路由在MVC第2天解释,捆绑在第5天解释,依此类推。所以请放松,目前不要考虑这个文件夹。
Content 此文件夹包含CSS(层叠样式表),它为您的项目提供统一的外观和感觉。
App_Data App_Data用于基于文件的数据存储。通常开发者使用RDBMS,如SQL Server、Oracle等,但有时人们也会使用XML、txt文件来存储数据。所以当您将数据存储在文件中时,会创建此文件夹。
字体 如果您的Web应用程序中使用了字体,您可以将它们放在这里。

步骤3:- 添加控制器

下一步是添加控制器。进入控制器文件夹,右键点击并选择控制器菜单,如下图所示。

接下来的屏幕是选择“支架”模板。支架(Scaffolding)是一种技术,MVC模板通过它帮助自动生成CRUD代码。CRUD代表创建(Create)、读取(Read)、更新(Update)和删除(Delete)。

但是目前我们正在学习MVC,所以选择Scaffolding或现成的代码不是一个好的选择。因此,请选择“MVC 5 空控制器”选项,如下图所示。

给控制器起一个名字,比如“FirstMVCController”。但是不要删除“Controller”这个词。“Controller”结尾是一种必要的约定。所以不要删除这个词。

控制器类创建后,如下图所示。向其中添加一个动作“SayHello”,如下图所示。一个控制器可以有多个动作。所以“Home”控制器可以有“GotoHome”、“GotoIndex”等动作。

public class FirstMVCController : Controller
    {
        //
        // GET: /FirstMVC/
        public ActionResult SayHello()
        {
            return View();
        }
	}

步骤4:- 添加视图

所以我们已经创建了控制器和动作。但是当最终用户请求控制器和动作时,我们需要调用一个视图。为了保持这个“Hello World”MVC示例的简单性,我们暂时不讨论模型。

现在,在您的文件夹部分,您应该看到一个以控制器名称命名的文件夹,即“FirstMVC”,如下图所示。

右键点击“FirstMVC”文件夹并添加一个视图。

给一个好听的名字,现在不要选择任何模板,因为我们想保持简单,所以选择“空(不带模型)”。

视图是一个简单的Razor HTML页面。在主体中,只需输入一些内容,就像我们在下面的代码中做的那样。

<body>
    
这是我的第一个MVC程序。

</body>

步骤5:- 将视图连接到控制器

视图已创建,控制器也已创建。是时候将视图与控制器连接起来了。所以在“SayHello”动作中,在视图里输入您的视图名称,如下面的代码所示。

public ActionResult SayHello()
{
            return View("HelloView");
}

步骤6:- 运行程序

一切就绪后,是时候享受您的第一个程序的输出了。按下Control键 + F5,并在localhost端口后输入以下URL。URL的输入方式如下:-

本地主机:端口号/控制器名称/动作名称

请注意,控制器名称应不带“controller”一词,如下图所示。

现在放松30秒,享受你的第一个程序。恭喜你走到这里。

警惕这个常见错误

如果您收到以下常见错误,请不要惊慌,您需要检查更多内容。

所以首先让我们尝试理解错误信息。错误说视图,即“HelloView”视图,应该放在共享文件夹中或控制器名称文件夹中。例如,在我们的例子中,控制器名称是“FirstMVC”,所以您要么将视图移动到“FirstMVC”文件夹,要么将其移动到“shared”文件夹,如下图所示。

那么下一个实验是什么?

既然我们已经创建了一个简单的MVC Hello World,现在是时候看看如何将数据从控制器传递到视图了。第一个请求到达控制器,控制器将加载您的业务对象或模型,您希望将这些对象传输到视图以进行显示。

实验2:在控制器和视图之间传递数据

控制器首先接收请求并加载模型。大多数时候,我们希望将模型传递给视图以进行显示。作为ASP.NET开发人员,您的选择可能是使用会话变量、视图状态或某些其他ASP.NET会话管理对象。

使用ASP.NET会话或视图状态对象的问题在于其范围。ASP.NET会话对象具有会话范围,而视图状态具有页面范围。对于MVC,我们希望将范围限制在控制器和视图。换句话说,我们希望在请求到达控制器并到达视图时维护数据,之后数据的范围应该过期。

这正是ASP.NET MVC框架中引入新会话管理技术——ViewData的地方。

实验2的视频演示

下面是一个简单的YouTube视频,演示了视图数据的实验。在这个视频中,我们将看到如何使用视图数据在控制器和视图之间共享数据。所以我们将创建一个简单的控制器,将当前数据记录到一个视图数据变量中,然后使用百分比标签在视图中显示相同的数据:http://youtu.be/Fu9v2MIDlTA?hd=1

步骤1:创建项目并设置视图数据

所以第一步是创建一个项目和一个控制器。在控制器中,按照下面的代码片段所示设置viewdata变量并启动视图。

public class DisplayTimeController : Controller
{
    //
    // GET: /DisplayTime/

    public ActionResult Index()
    {
        ViewData["CurrentTime"] = DateTime.Now.ToString();
        return View();
    }
}

步骤2:在视图中显示视图数据。

接下来是在视图中使用百分比标签显示数据。需要注意的一个重要点是,视图没有代码后台。因此,为了显示视图,我们需要在ASPX页面中使用<%:标签,如下面的代码片段所示。

<body>
<div>
<%: ViewData["CurrentTime"] %>
</div>
</body>

那么下一个实验是什么?

既然我们已经知道如何使用视图数据传递数据,那么下一个实验就是创建一个简单的模型,并查看所有三个MVC实体(即模型、视图和控制器)的实际运行。

实验3:使用MVC创建一个简单的模型

在这个实验中,我们将创建一个简单的客户模型,为其填充一些数据,并在视图中显示它。

实验3的视频演示

下面是一个视频演示:http://youtu.be/0-UdqWy9lVc?hd=1

步骤1:创建一个简单的类文件

第一步是创建一个简单的客户模型,它只是一个包含三个属性(代码、名称和金额)的类。创建一个简单的MVC项目,右键单击模型文件夹,然后单击“添加新项”,如下图所示。

从模板中选择一个简单类并将其命名为Customer

使用三个属性创建类,如下面的代码片段所示。

public class Customer
{
    private string _Code;
    private int _Id;
    private double _Amount;

    public string CustomerCode
    {
        set
        {
            _Code = value;
        }
        get
        {
            return _Code;
        }
    }

    public int Id
    {
        get
        {
            return _Id;
        }
        set
        {
            _Id= value;
        }
    }

    public double Amount
    {
        set
        {
            _Amount = value;
        }
        get 
        {
            return _Amount;
        }
    }
}

步骤2:定义带有动作的控制器

下一步是添加控制器并创建一个简单的动作来显示客户,如下面的代码片段所示。在控制器类中导入模型命名空间。在动作中,我们创建客户类的对象,填充一些数据,并将其传递给名为“DisplayCustomer”的视图。

public class CustomerController : Controller
{
    …..
    ….
    public ViewResult DisplayCustomer()
    {
        Customer objCustomer = new Customer();
        objCustomer.Id = 12;
        objCustomer.CustomerCode = "1001";
        objCustomer.Amount = 90.34;

        return View("DisplayCustomer",objCustomer);
    }
}

步骤3:使用类创建强类型视图

我们现在需要通过创建视图来连接MVC的各个点。所以右键单击视图文件夹并点击“添加视图”。您应该会看到一个下拉菜单,如下图所示。输入视图名称,勾选“创建强类型视图”,然后使用下拉菜单将此视图绑定到客户类,如下图所示。


注意:如果您在下拉列表中看不到模型,请先编译您的项目。

创建强类型视图的优点是,您现在可以通过输入模型和“.”在视图中获取类的属性,如下图所示。

以下是显示客户属性值的视图代码。我们还设置了一个if条件,如果金额高于100,则显示为特权客户,如果低于100,则显示为普通客户。

<body>
<div>
The customer id is <%= Model.Id %> <br />

The customer Code is <%= Model.CustomerCode %> <br />

<% if (Model.Amount > 100) {%>
This is a priveleged customer
<% } else{ %>
This is a normal customer
<%} %>

</div>
</body>

步骤4:运行您的应用程序

现在是“D”环节,按下Ctrl + F5,并为又一个实验成功而庆祝。

那么下一个实验是什么?

在这个示例中,我们从控制器内部填充了客户对象。在下一个实验中,我们将从输入视图中获取数据并显示它。换句话说,我们将看到如何创建数据录入屏幕以接受视图中的数据。

实验4:创建一个简单的MVC数据录入屏幕

每个项目,无论大小,都需要数据录入屏幕。在这个实验中,我们将使用MVC模板创建一个简单的客户数据录入屏幕,如下图所示。

一旦最终用户输入详细信息并提交数据,它将重定向到如下图所示的屏幕。如果输入的金额小于100,则显示普通客户,否则显示特权客户。

实验4的视频演示

这是本实验的一个简单视频演示:http://youtu.be/1dlxtHuRw34?hd=1

步骤1:创建数据录入ASPX页面

第一步是使用简单的HTML表单动作标签创建数据录入页面,如下面的代码片段所示。下面的代码片段中最重要的注意事项是动作指向控制器动作,即“DisplayCustomer”。

<form action="DisplayCustomer" method="post">
Enter customer id :- <input type="text" name="Id" /> <br />
Enter customer code :- <input type="text" name="CustomerCode" /><br />
Enter customer Amount :-<input type="text" name="Amount" /><br />
<input type="submit" value="Submit customer data" />
</form>

步骤2:创建控制器

上面定义的表单动作将提交到控制器类和函数“DisplayCustomer”。因此,我们需要从HTML控件中获取数据,填充对象,并将对象发送到视图。

以下是DisplayCustomer的代码片段,它通过从Request.Form收集数据来填充客户对象,并将该对象发送到视图DisplayCustomer

public class CustomerController : Controller
{
    …..
    ….
    [HttpPost]
    public ViewResult DisplayCustomer()
    {
        Customer objCustomer = new Customer();
        objCustomer.Id = Convert.ToInt16(Request.Form["Id"].ToString());
        objCustomer.CustomerCode = Request.Form["Id"].ToString();
        objCustomer.Amount = Convert.ToDouble(Request.Form["Amount"].ToString()); ;
        return View("DisplayCustomer", objCustomer);
    }
}

步骤3:创建视图以显示客户对象

下一步是创建“DisplayCustomer”视图。所以右键点击视图文件夹并点击“添加视图”。您应该会看到一个下拉菜单,如下图所示。输入视图名称,勾选“创建强类型视图”,然后使用下拉菜单将此视图绑定到客户类,如下图所示。

创建强类型视图的优点是,您现在可以通过输入模型和“.”在视图中获取类的属性,如下图所示。

以下是显示客户属性值的视图代码。我们还设置了一个if条件,如果金额高于100,则显示为特权客户,如果低于100,则显示为普通客户。

<body>
<div>
The customer id is <%= Model.Id %> <br />

The customer Code is <%= Model.CustomerCode %> <br />

<% if (Model.Amount > 100) {%>
This is a priveleged customer
<% } else{ %>
This is a normal customer
<%} %>

</div>
</body>

步骤4:最终运行项目

最后一步是运行项目并查看输出。

您还应该能够测试高于100和低于100的情况。

那么下一个实验是什么?

在这个实验中,我们创建了一个简单的数据录入屏幕,帮助我们填充客户对象。然后将此客户对象传递给视图以进行显示。如果您仔细观察当前的实验,我们编写了大量的代码,即创建HTML屏幕、填充对象等。如果有某种自动化功能会很棒。在下一个实验中,我们将看到HTML辅助类如何帮助最小化许多此类手动编码,从而提高生产力。

实验5:使用HTMLHelper更快地创建视图

在之前的实验中,我们创建了一个简单的客户数据录入屏幕。我们成功完成了实验,但存在两个大问题:

<form action="DisplayCustomer" method="post">
Enter customer id :- <input type="text" name="Id" /> <br />
Enter customer code :- <input type="text" name="CustomerCode" /><br />
Enter customer Amount :-<input type="text" name="Amount" /><br />
<input type="submit" value="Submit customer data" />
</form>

public class CustomerController : Controller
{
    …..
    ….
    [HttpPost]
    public ViewResult DisplayCustomer()
    {
        Customer objCustomer = new Customer();
        objCustomer.Id = Convert.ToInt16(Request.Form["Id"].ToString());
        objCustomer.CustomerCode = Request.Form["Id"].ToString();
        objCustomer.Amount = Convert.ToDouble(Request.Form["Amount"].ToString()); ;
        return View("DisplayCustomer", objCustomer);
    }
}
  • 完整的HTML代码是手动编写的。换句话说,效率较低。这就像回到了开发者在记事本中编写HTML标签的黑暗时代。
  • 除此之外,控制器中还编写了大量手动代码来填充对象并将数据发送到MVC视图。

在本实验中,我们将探讨如何使用MVC HTMLHelper类来最大程度地减少手动编码并提高生产力。

步骤1:创建Customer类

创建一个简单的客户类,详情请参阅实验5。

步骤2:使用辅助类创建HTML输入表单

HTML辅助类拥有现成的函数,通过它们您可以轻松创建HTML控件。进入任何MVC视图并查看HTMLHelper类的智能感知,您应该会看到如下图所示的内容。

通过使用HTMLHelper类,您只需调用相应的函数即可创建任何HTML控件,如TextBoxLabelListBox等。

为了创建HTML的form标签,我们需要使用“Html.BeginForm”。下面是它的代码片段。

<% using (Html.BeginForm("DisplayCustomer","Customer",FormMethod.Post)) 
{%>
-- HTML input fields will go here 
<%} %>

上述代码将生成以下HTML

<form action="DisplayCustomer" method="post">
…..
…..
</form>

HTML辅助器“beginform”接受三个输入参数:动作名称(控制器内部的方法)、控制器名称(实际控制器名称)和HTTP提交方法(POST或GET)。

如果要创建文本框,只需使用HTMLHelper类的“TextBox”函数,如下面的代码所示。这样您就可以使用HTMLHelper类函数创建HTML控件。

Enter customer id :- <%= Html.TextBox("Id",Model)%> <br />

上述代码片段将生成以下HTML代码

Enter customer id :- <input type="text" name="Id" /> <br />

要创建如下图所示的数据录入屏幕,我们需要使用以下代码片段。

<% using (Html.BeginForm("DisplayCustomer","Customer",FormMethod.Post))
{ %>
Enter customer id :- <%= Html.TextBox("Id",Model)%> <br />
Enter customer code :- <%= Html.TextBox("CustomerCode",Model) %><br />
Enter customer Amount :- <%= Html.TextBox("Amount",Model) %><br />
<input type="submit" value="Submit customer data" />
<%} %>

步骤3:使用客户类创建强类型视图

所以一旦您使用HTMLHelper类创建了视图,是时候将客户类与视图关联起来了;详情请参阅实验5。

步骤4:创建控制器类

最后是控制器代码。现在控制器代码变得非常简单。由于我们使用了HTML Helper类,客户对象将自动填充。您将像在实验4中那样创建控制器类,但我们不需要编写任何代码来连接HTML屏幕和控制器,它都被隐藏和自动化了。

[HttpPost]
public ActionResult DisplayCustomer(Customer obj)
{
    return View(obj);
}

请享受针对不同客户输入金额条件下的输出。

所以,为完成MVC实验的第一天干杯!

第二天会讲什么?

在第二次会话中,我们将讨论URL路由、MVC单元测试的简易性、MVC控制器属性等等。与第一天相比,下一个实验会稍微高级一些。以下是第二天的链接:点击这里进入第二天MVC逐步学习

关于MVC的进一步阅读

以下是您可以探索的更多MVC学习链接

从 MVC 5 开始

如果您想从 MVC 5 开始,请从下面的视频“2 天学会 MVC 5”开始。

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.