MVC是Model-View-Controller的简写。MVC是一种开发良好架构,可测试,易维护应用程序的设计模式。据于MVC的应用程序应该包含:
Models: 是呈现应用程序数据和使用验证逻辑给指定的数据强制执行业务规则的Class类。
Views: 是你的应用程序用来动态产生HTML响应的模板文件。
Controllers: 是用来处理传入浏览器的请求,从Model里面取数据,然后指定返回浏览器响应的视图模板的Class类。
在本教程中我们将覆盖这些所有的概念,并且向你显示如何使用他们。
1. 创建Controller
让我们开始创建一个Controller类。在Solution Explorer下,右击Controllers文件夹然后点击Add,最后选择Controller。
在弹出的Add Scaffold对话框中,点击MVC 5 Controller - Empty, 然后点击Add。
给你的新的Controller命名为“HelloWorldController”,然后点击Add。
注意:
在Solution Explorer下一个叫HelloWorldController.cs和一个新的文件夹Views/HelloWorld被创建了。在IDE中这个controller默认被打开。
用下面的代码替换这个文件中内容:
1 using System.Web; 2 using System.Web.Mvc; 3 4 namespace MvcMovie.Controllers 5 { 6 public class HelloWorldController : Controller 7 { 8 // 9 // GET: /HelloWorld/Index 10 public string Index() 11 { 12 return "This is my <b>Default</b> action method..."; 13 } 14 15 // 16 // GET: /HelloWorld/Welcome 17 public string Welcome() 18 { 19 return "This is the Welcome action method..."; 20 } 21 } 22 }
这个controller方法将返回一个HTML字符串作为一个例子。这个controller被命名为HelloWorldController和这第一个方法命名为Index. 接下来让我们从浏览器调用这个方法。运行这个应用程序,在这个浏览器上的地址栏中添加“HelloWorld”路径(例如:http://localhost:5000/HelloWorld). 在浏览器中的页面将显示如下。在上面的方法中,代码直接返回了一个字符串。你告诉系统仅仅返回一些HTML,而且这个系统也如我们所愿!
2. 路由配置
ASP.NET MVC根据传入的URL调用不同的controller类(其中包含不同的action方法)。ASP.NET MVC通过使用默认的URL路由规则来决定什么代码将被调用,让我们来看一下这个默认的下路由配置:
/[Controller]/[ActionName]/[Parameters]
你可以在App_Start/RouteConfig.cs文件中设置这个路由规则。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9 ); 10 }
当你没有提供任何URL段来运行应用程序时,这个应用程序默认使用“Home” controller及其中的“Index” action方法作为默认的URL(如上代码所示) 。
这个URL的第一部分决定了controller类的执行,因此/HelloWorld与HelloWorldController类匹配。URL第二部分决定了这个controller类中action方法的执行,因此/HelloWorld/Index将导致HelloWorldController中的Index方法执行。注意:我们仅在浏览器地址栏中给出了/HelloWorld,而Index方法是默认使用的。这是因为如果一个controller没有指定其所调用的action方法,那么其会默认调用命名为Index的action方法。URL的第三部分是给路由数据用的。在这个教程中我们将看到这些路由数据。
浏览http://localhost:xxxx/HelloWorld/Welcome。这个Welcome方法将返回字符串“This is the Welcome action method...”。这个默认的MVC匹配的路由是/[Controller]/[ActionName]/[Parameters]。对于这个URL,它的controller是HelloWorld,action方法是Welcome,并且你还没有使用[Parameters]部分。
为了我们能够传递参数信息给这个URL,让我们轻微的修改这个例子(例如:/HelloWorld/Welcome?name=zhonghua&numtimes=5).修改你的Welcome方法以便能包含上面的2个参数。注意:这个代码用了C#的可选功能来定义numTimes参数,如果没有值传入,其默认的值为1。
1 public string Welcome(string name, int numTimes = 1) 2 { 3 return HttpUtility.HtmlEncode("Hello " + name + ", NumTiems is " + numTimes); 4 }
安全提示:上面的代码用了HttpServerUtility.HtmlEncode来保护这个应用程序,避免用户的非法输入。想了解更多信息,请查看 How to: Protect Against Script Exploits in a Web Application by Applying HTML Encoding to Strings
运行你的应用程序,浏览到这个示例的URL地址(http://loaclhost:xxxx/HelloWorld/Welocme?name=zhonghua&numtimes=5).你也可以在URL的name和numTimes尝试不同的值。这个ASP.NET MVC模型绑定系统将会从地址栏中的query String到你方法中的参数自动的匹配命名的参数。
在上面的例子中,URL参数部分还是没有被使用到,这个name和numTimes参数是作为query strings被传入的。URL中的“?”相当于一个分割线,后面跟着的是查询字符串,不同的参数之间用“&”字串连接。
用下面的代码替换Welcome中的方法:
1 public string Welcome(string name, int ID = 1) 2 { 3 return HttpUtility.HtmlEncode("Hello " + name + ", ID is " + ID); 4 }
运行这个应用程序,然后键入URL地址:http://localhost:xxxx/HelloWorld/Welcome/3?name=zhonghua
这次URL匹配了路由参数ID.这个Welcome方法包含了一个与登记路由方法中定义的URL相匹配的ID。
1 public static void RegisterRoutes(RouteCollection routes) 2 { 3 routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 4 5 routes.MapRoute( 6 name: "Default", 7 url: "{controller}/{action}/{id}", 8 defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 9 ); 10 }
在ASP.NET MVC应用程序中,通过路由数据传入参数比通过查询字符串(query strings)来传入参数是更加普遍的。你也可以在URL的路由数据中添加name和numtimes参数。如在App_StartRouteConfig.cs文件中,添加“Hello”路由:
1 routes.MapRoute(
2 name:"Hello",
3 url:"{controller}/{action}/{name}/{id}"
4 );
运行这个应用程序,并键入地址: /localhost:xxxx/HelloWorld/Welcome/zhonghua/3
对于大多数MVC应用程序而言,默认的路由使用起来也比较方便。在稍后的章节了我们将学习通过模型绑定来传染数据,到时候你将不得不修改默认的路由配置。
在这些例子中这个controller已经作了MVC中的“VC”部分 -- 也就是View和Controller可以起作用了。这个controller直接返回HTML。通常情况下,你并不想controller直接返回HTML,因为这将使得代码和粗糙。取而代之的是我们用视图文件来产生HTML响应。接下来让我们看看如何使用这个视图文件吧。