[译]ASP.NET MVC 5入门 添加控制器

添加一个控制器

By Rick Anderson|October 17, 2013

MVC 即 模型-视图-控制器.  MVC 是一个开发应用程序的模式,MVC有很良好的架构,测试维护简单。基于MVC的应用程序包含:

  • 模型: 表现应用程序的数据和使用校验逻辑增强数据业务规则的类。

  • 视图: 应用程序中动态产生网页响应的模板文件。

  • 控制器: 处理浏览器的请求,检索模型数据,指定视图模板,并将回应返回给浏览器的类。

在本系列教程中会覆盖上面这些所有的概念,并将使用他们创建一个应用程序。

让我们从创建一个控制器类开始。在解决方案管理器中,右键单击控制器文件夹然后点击添加,选择控制器。

 

[译]ASP.NET MVC 5入门 添加控制器_第1张图片

添加基架模板对话框中,选择MVC 5  控制器,然后点击添加。

[译]ASP.NET MVC 5入门 添加控制器_第2张图片
 

命名你的控制器为"HelloWorldController",然后点击添加

[译]ASP.NET MVC 5入门 添加控制器_第3张图片

注意,在解决方案管理器中,创建了一个名为HelloWorldController.cs 的文件,并增加了一个新的文件夹Views\HelloWorld。打开控制器进行编辑。

[译]ASP.NET MVC 5入门 添加控制器_第4张图片

用下面的代码替换文件中的内容。

using System.Web;using System.Web.Mvc; 
 namespace MvcMovie.Controllers { 
    public class HelloWorldController : Controller 
    { 
        //         // GET: /HelloWorld/  
        public string Index() 
        { 
            return "This is my <b>default</b> action..."; 
        } 
 
        //         // GET: /HelloWorld/Welcome/  
        public string Welcome() 
        { 
            return "This is the Welcome action method..."; 
        } 
    } }

控制器方法会返回一个网页的字符串。控制器命名为 HelloWorldController,第一个方法命名为Index.  现在可以在浏览器中调用了。按F5 或Ctrl+F5运行此程序。在浏览器的地址栏中添加 "HelloWorld" 。(就像下图所示的浏览器地址栏中的http://localhost:1234/HelloWorld.)  浏览器中的网页会看起来下下面的截图一样。在上面的方法中,代码直接返回的字符串。你也可以让系统返回一些其他的HTML内容,没问题。

[译]ASP.NET MVC 5入门 添加控制器_第5张图片

ASP.NET MVC通过传入的地址调用了不同的控制器类(和类中不同的动作方法) 。ASP.NET  MVC使用下面这种格式来决定调用的代码作为默认的URL路由逻辑:

/[控制器]/[动作名]/[参数]

你可以在App_Start/RouteConfig.cs文件中设置路由的格式

public static void RegisterRoutes(RouteCollection routes){
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(        
        name: "Default",
                url: "{controller}/{action}/{id}",
                        defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }    );
}

上面的代码中,如果你在程序运行时给出了一个不能识别的URL,程序默认会转到"Home" 控制器和"Index"动作方法。

URL的第一部分决定了要执行的控制器类。因此 /HelloWorld 会映射到HelloWorldController这个类.  URL的第二部分决定了类中要执行的动作方法。因此 /HelloWorld/Index 这样的URL会执行HelloWorldController类中的Index 动作方法。注意,我们只需让浏览打开/HelloWorld,实际默认执行了Index 方法。如果调用控制器却没有指定方法时,Index方法会作为默认的方法执行。URL中第三段 ( 参数)是路由的数据。在本教程的后面我们会看到路由数据。

浏览到 http://localhost:xxxx/HelloWorld/WelcomeWelcome 被执行并返回了 "This is the Welcome action method..."这个字符串。 MVC默认的映射为/[控制器]/[动作方法]/[参数].  在这个URL地址中,控制器是HelloWorld ,Welcome是动作方法,这里还没有使用到参数这部分。

[译]ASP.NET MVC 5入门 添加控制器_第6张图片

我们来稍微的修改一下上面的例子就可以通过URL向控制器传递一些参数(例如, /HelloWorld/Welcome?name=Scott&numtimes=4). 修改Welcome这个方法让他包含下面这两个参数。注意,代码中使用C# 可选参数这个特点,如果没有传递numTimes这个参数,那么,他的默认值就为1。 

public string Welcome(string name, int numTimes = 1) {
     return HttpUtility.HtmlEncode("Hello " + name + ", NumTimes is: " + numTimes);
}

安全提示: 什么的代码使用了 HttpServerUtility.HtmlEncode 来保护应用免受恶意的输入攻击 (即 JavaScript)。更多信息请参见 如何应用HTML编码以防止脚本攻击来保护应用程序.

运行应用程序并导航到下面的地址 (http://localhost:xxxx/HelloWorld/Welcome?name=Scott&numtimes=4)。你可以在又矮一种尝试不同的 name 和 numtimes参数。 ASP.NET MVC模型绑定系统 会自动的把地址栏中查询字符串的命名参数映射到方法中。

[译]ASP.NET MVC 5入门 添加控制器_第7张图片

上面的例子中,URL参数没有被使用, name 和 numTimes参数是通过query strings传递的,上面URL中的? (问号)是一个分隔符,分隔URL和查询字符串。 & 用于查询字符串间的分隔。

用下面的代码替换Welcome 方法:

public string Welcome(string name, int ID = 1){
    return HttpUtility.HtmlEncode("Hello " + name + ", ID: " + ID);
}

运行应用程序并键入下面的网址:http://localhost:xxx/HelloWorld/Welcome/3?name=Rick

[译]ASP.NET MVC 5入门 添加控制器_第8张图片

这次URL中的第三段匹配了路由参数 ID. Welcome动作方法包含了一个 ID参数,RegisterRoutes 方法中包含了这条路由匹配规则。

public static void RegisterRoutes(RouteCollection routes){
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
        routes.MapRoute(
            name: "Default",
            url: "{controller}/{action}/{id}",
            defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }
      );
}

在ASP.NET MVC 应用程序里,通过参数和路由数据传递比通过查询字符串传递更常见(就像上面的ID)。 你也可以添加路由,将name and numtimes作为参数来传递路由数据。在App_Start\RouteConfig.cs  文件中,添加"Hello" 路由:

public class RouteConfig{
   public static void RegisterRoutes(RouteCollection routes)   {
         routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
         routes.MapRoute(          
             name: "Default",          
             url: "{controller}/{action}/{id}",          
             defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional }      
        );      
        routes.MapRoute(           
            name: "Hello",           
            url: "{controller}/{action}/{name}/{id}"   
        );   
   }
}

运行程序并导航至:/localhost:XXX/HelloWorld/Welcome/Scott/3.

[译]ASP.NET MVC 5入门 添加控制器_第9张图片

默认的路由就可以让许多MVC应用程序工作的很好, 本教程之后会学习到通过模型绑定来传递数据,因此不必去修改默认的路由。

在这些例子中,控制器已经做了"MVC" 中"VC"部分 — 视图和控制器的工作。控制器直接返回了HTML代码。通常不会在控制器中直接返回HTML,因为这样做会使带来显得很笨重。通常是使用分离的视图模板来帮助产生HTML响应内容,我们看下一步是如何做的。

这篇文章最初创建于2013年10月17日

作者信息

Rick Anderson

Rick Anderson – Rick Anderson 是微软的一个程序员,专注于ASP.NET MVC, Windows Azure 和实体框架. 你可以在推特上关注他: @RickAndMSFT.

你可能感兴趣的:(mvc,asp.net,控制器)