1 理解MVC
MVC代表: 模型-视图-控制器。MVC是一个架构良好并且易于测试和易于维护的开发模式。
基于 MVC 模式的应用程序包含:
● Models:表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据类。
● Views:应用程序动态生成 HTML 所使用的模板文件。
● Controllers:处理浏览器的请求,取得数据模型,然后指定要响应浏览器请求的视图模板。
本讲义将覆盖所有这些概念,并告诉你如何使用它们来构建应用程序。
创建一个空的MVC4 Web应用程序
运行VS2013,选择菜单“文件 > 新建 > 项目”,项目名为“ChA201_理解MVC”、项目类型为“ASP.NET MVC4 Web应用程序”,如下图如下。
在新的 ASP.NET MVC 4 项目对话框中,选择“空”模板。使用 Razor 作为默认视图引擎,如下图。
单击“确定”按钮。Visual Studio 刚刚创建的 ASP.NET MVC 项目是一个空的项目,完成后查看建立的文件及其下面的文件,如下图。
测试运行,结果如下。
添加一个控制器
首先,让我们创建一个控制器类。在解决方案资源管理器中,用鼠标右键单击控制器(Controllers)文件夹,然后选择“添加控制器”。
命名新的控制器为“HelloWorldController”。保留默认的模板为“空MVC控制器”,并单击“添加”按钮。
这时,在解决方案资源管理器中会创建一个名为 HelloWorldController.cs 的新文件,并被 IDE 默认打开。
用下面的代码替换该文件中的内容。
publicclassHelloWorldController : Controller
{
publicstring Index()
{
return"这是一个<b>Default</b>的操作方法";
}
publicstring Wellcome()
{
return"这是一个 Wellcome 的操作方法";
}
}
在上例中控制器方法将返回一个Html字符串。HelloWorldController控制器的第一种方法被命名为 Index。让我们从浏览器中调用它。
运行应用程序(按 F5 或 CTRL + F5)。在浏览器的地址栏中输入路径“HelloWorld“。(例如,在下面的示例中: localhost:55799/HelloWorld)页面在浏览器中的表现如下面的界面。在上面的方法中,代码直接返回了一个字符串。
根据传入的 URL,ASP.NET MVC 调用不同的控制器类(和它们之中不同的操作方法)。
使用 ASP.NET MVC 默认的 URL 路由逻辑格式,以确定哪些代码会被调用:
/[Controller]/[ActionName]/[Parameters]
第一部分的 URL 确定那个控制器类会被执行。因此 /HelloWorld 映射到HelloWorldController 控制器类。第二部分的 URL 确定要执行控制器类中的那个操作方法。因此 /HelloWorld/Index,会使得 HelloWorldController 控制器类的 Index 方法被执行。注意,我们只需要浏览 /HelloWorld 路径,默认情况下会调用 Index 方法。如果没有明确的指定操作方法,Index 方法会默认的被控制器类调用。
浏览 localhost:xxxx/HelloWorld/Welcome。Welcome 方法会被运行并返回字符串:"这是一个 Welcome 的操作方法”。 默认的 MVC 映射为/[Controller]/[ActionName]/[Parameters],对于这个 URL,控制器类是 HelloWorld,操作方法是 Welcome,注意,这里还没有使用过 URL 的[Parameters] 部分。
让我们稍微修改一下这个例子,以便可以使用 URL 传递一些参数信息给控制器类(例如, /HelloWorld/Welcome?name=李文华&numtimes=4)。改变 Welcome 方法来包含两个参数,如下所示。需要注意的是,示例代码使用了 C#语言的可选参数功能,numTimes参数在不传值时,默认值为 1。
publicstring Wellcome(mvc三层架构如何实现string name, int numTimes = 1)
{
returnHttpUtility.HtmlEncode("Hello " + name + ",重复次数:" + numTimes);
}
运行应用程序并浏览此 URL(localhost:xxxx/HelloWorld/Welcome?name=李文华&numtimes=4)。你可以对参数name 和 numtimes 尝试不同的值。 ASP.NET MVC model binding system 会自动将地址栏中URL 里的 query string 映射到方法中对应的参数。
在上面的两个例子中,控制器一直在做着 MVC 中“VC”部分的职能。 也就是视图和控制器的工作。该控制器直接返回 HTML 内容。通常情况下,你不会让控制器直接返回 HTML,因为这样代码会变得非常的繁琐。相反,我们通常会使用一个单独的视图模板文件来帮助生成返回的 HTML。接下来让我们来看看如何能做到这一点。
添加一个视图
在本节中,需要修改 HelloWorldController 类,从而使用视图模板文件,干净优雅的封装生成返回到客户端浏览器 HTML 的过程。
将创建一个视图模板文件,其中使用了 ASP.NET MVC 3 所引入的 Razor 视图引擎。Razor 视图模板文件使用.cshtml 文件扩展名,并提供了一个优雅的方式来使用 C#语言创建所要输出的 HTML。用 Razor 编写一个视图模板文件时,将所需的字符和键盘敲击数量降到了最低,并实现了快速,流畅的编码工作流程。
当前在控制器类中的 Index 方法返回了一个硬编码的字符串。更改 Index 方法返回一个View 对象,如下面的示例代码:
publicActionResult Index()
{
return View();
}
上面的 Index 方法使用一个视图模板来生成一个 HTML 返回给浏览器。控制器的方法(也被称为 action method(操作方法) ),如上面的 Index 方法,一般返回一个 ActionResult(或从 ActionResult 所继承的类型),而不是原始的类型,如字符串。
在该项目中,你可以使用的 Index 方法来添加一个视图模板。要做到这一点,在 Index 方法中单击鼠标右键,然后单击“ 添加视图“。
弹出“添加视图”对话框。保留缺省值,并单击“添加”按钮。
您可以在解决方案资源管理器中看到 MvcMovie\HelloWorld 文件夹和已被创建的MvcMovie\View\HelloWorld\Index.cshtml 文件。
在<h2>标签后面添加如下代码所示的 HTML。
@{
ViewBag.Title = "Index";
}
<h2>Index</h2>
<p>Hello:来自我的视图模板</p>
运行应用程序并在浏览器中浏览:HelloWorld 控制器(localhost:xxxx/HelloWorld“)。在您控制器的 Index 方法中并没有做太多的工作,它只是执行了 return View(),这个方法指定使用一个视图模板文件来显示返回给浏览器的 HTML。因为你没有明确指定使用那个视图模板文件,ASP.NET MVC 会默认使用\Views\HelloWorld 文件夹下的 Index.cshtml 视图文件。下图显示了在视图文件中硬编码的字符串 "Hello:来自我的视图模板"。
将数据从控制传递给视图
在我们讨论数据库和数据模型之前,让我们先讨论一下如何将数据从控制器传递给视图。控制器类将响应请求来的 URL。控制器类是让你写代码来处理传入请求的地方,并从数据库中检索数据,最终决定将什么类型的返回结果发送回浏览器。视图模板可以被控制器用来产生
格式化过的 HTML 从而返回给浏览器。
控制器负责给任何数据或者对象提供一个必需的视图模板,用这个视图模板来显示返回给浏览器的 HTML。最佳做法是:一个视图模板应该永远不会执行业务逻辑或者直接和数据库进行交互。相应的,一个视图模板应该只和控制器所提供的数据进行交互。维持这种“隔离关系”可以帮助我们保持代码的干净、测试性和更易维护。
当前,HelloWorldController 类中 Welcome 操作方法需要一个 name 和一个 numTimes 参数,然后直接输出给浏览器。视图模板是可以生成动态的 HTML的,这意味着需要通过适当的方式把数据从控制器传递给视图,从而才能生成动态的 HTML。你可以把视图模板需要的动态数据 (参数)在控制器中放入到一个 ViewBag 对象中,然后视图模板可以访问这个对象了。
打开 HelloWorldController.cs 文件,更改 Welcome 方法,将 Message 和 NumTimes 的值添加到 ViewBag 对象里。ViewBag 是一个动态的对象,这意味着在您没有给 ViewBag 放置属性时,它没有任何属性,您可以把任何您想放置的对象放入到 ViewBag 对象中。 ASP.NET 中的MVC模型绑定机制会自动将地址栏中 URL 里的查询串(如:?name=李文华
&numTimes=4)映射到你方法中的参数(name 和 numTimes)。修改后的 HelloWorldController.cs 文件中的Wellcome方法如下所示。
publicActionResult Wellcome(string name, int numTimes = 1)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论