(asp.net MVC学习)控制器Controller以及Action

文章标签: asp.net
2014-12-17 13:12:44     12 人阅读    

今天说说Controller以及Action,我觉得在MVC中最重要的Controller,它是接受请求和处理的组件,也是Model与View之间的桥梁,基本上业务逻辑都在这里实现。今天就说说如何创建Controller吧。目前ASP.NET MVC 2 RC版本可以通过模板来创建Controller。
创建Controller类,必须要继承System.Web.Mvc.Controller这个抽象类。另外类名也必须与”Controller”的字符串结尾。很像声明特性一样,类名结尾必须是Attribute一样。例如:AbcController那么Controller的名称为Abc。其实不需要将Controller放到Controller目录中或当前项目中,默认情况下ASP.NET MVC框架会在Web应用程序引用的所有程序集内查找Controller。
另外就是Controller的选择规则,它是靠URL Routing在接受到URL地址后,提取后的数据如果没有对应的规则,将如普通的asp.net应用程序一样使用。如果确认了规则,但是数据又没有指定Controller,将会报错。默认会在配置中指定默认的Controller。
 
Controller是一个类,那么Action就是Controller中的一个方法啦。Action的声明是有要求的分别是:1.Action的返回类型是有要求的,必须返回继承自ActionResult这个抽象类。2.声明Action它必须是公共的实例方法,3.不能是泛型方法并且不可以使用NonActionAttribute进行标记的(如果URL Routing指定Controller但未指定Action,默认就执行标记NonActionAttribute方法)。4.不能被重载。
返回类型一共有那些呢。那我来介绍一下吧。
1.       ViewResult 返回一个视图,也就是一个网页,在Controller类中的返回方法是View()。这个一般情况就是最常用的啦。
2.       PartialViewResult 用来返回用户控件有时候使用用户控件替换一部分内容是非常好用的,在Controller中的方法是PartialView()。
3.       RedirectResult 将网页重定向到指定的url或者到其它方法,在Controller中的方法是Redirect()。
4.       RedirectToRouteResult 重定向到其它的Action,使用Controller中的方法有两种分别是RedirectToAction()和RedirectToRoute()。
5.       ContentResult 返回用户自定义的内容类型,使用Controller中的方法是Content()。
6.       JsonResult 返回Json对象,使用Controller中的方法是Json()。
7.       JavaScriptResult 返回Javascript脚本到客户端执行。使用Controller中的方法是JavaScript()。
8.       FileResult 返回二进制数据给客户端。作用Controller中的File()方法。
9.       EmptyResult 这是当Action返回类型为Void时,Action返回的类型就是EmptyResult,当然也就无返回方法了。
我比较懒,在网上找到一段代码就帖出来大家看看。^-^

代码

 

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Mvc.Ajax;

using System.IO;

namespace MVC.Controllers
{
    /**/
    /// <summary>
    /// Controller 类必须以字符串 "Controller" 做类名称的结尾,字符串 Controller 之前的字符串为 Controller 的名称,类中的方法名为 Action 的名称
    /// </summary>
    public class ControllerDemoController : Controller
    {
        // [NonAction] - 当前方法仅为普通方法,不解析为 Action
        // [AcceptVerbs(HttpVerbs.Post)] - 声明 Action 所对应的 http 方法

        /**/
        /// <summary>
        /// Action 可以没有返回值
        /// </summary>
        public void Void()
        {
            Response.Write(string.Format("<span style='color: red'>{0}</span>", "void"));
        }

        /**/
        /// <summary>
        /// 如果 Action 要有返回值的话,其类型必须是 ActionResult
        /// EmptyResult - 空结果
        /// </summary>
        public ActionResult EmptyResult()
        {
            Response.Write(string.Format("<span style='color: red'>{0}</span>", "EmptyResult"));
            return new EmptyResult();
        }

        /**/
        /// <summary>
        /// Controller.Redirect() - 转向一个指定的 url 地址
        /// 返回类型为 RedirectResult
        /// </summary>
        public ActionResult RedirectResult()
        {
            return base.Redirect("~/ControllerDemo/ContentResult");
        }

        /**/
        /// <summary>
        /// Controller.RedirectToAction() - 转向到指定的 Action
        /// 返回类型为 RedirectToRouteResult
        /// </summary>
        public ActionResult RedirectToRouteResult()
        {
            return base.RedirectToAction("ContentResult");
        }

        /**/
        /// <summary>
        /// Controller.Json() - 将指定的对象以 JSON 格式输出出来
        /// 返回类型为 JsonResult
        /// </summary>
        public ActionResult JsonResult(string name)
        {
            System.Threading.Thread.Sleep(1000);

            var jsonObj = new { Name = name, Age = new Random().Next(20, 31) };
            return base.Json(jsonObj);
        }

        /**/
        /// <summary>
        /// Controller.JavaScript() - 输出一段指定的 JavaScript 脚本
        /// 返回类型为 JavaScriptResult
        /// </summary>
        public ActionResult JavaScriptResult()
        {
            return base.JavaScript("alert('JavaScriptResult')");
        }

        /**/
        /// <summary>
        /// Controller.Content() - 输出一段指定的内容
        /// 返回类型为 ContentResult
        /// </summary>
        public ActionResult ContentResult()
        {
            string contentString = string.Format("<span style='color: red'>{0}</span>", "ContentResult");
            return base.Content(contentString);
        }

        /**/
        /// <summary>
        /// Controller.File() - 输出一个文件(字节数组)
        /// 返回类型为 FileContentResult
        /// </summary>
        public ActionResult FileContentResult()
        {
            FileStream fs = new FileStream(Request.PhysicalApplicationPath + "Content/loading.gif", FileMode.Open);
            int length = (int)fs.Length;
            byte[] buffer = new byte[length];
            fs.Read(buffer, 0, length);
            fs.Close();

            return base.File(buffer, "image/gif");
        }

        // <summary>
        /**/
        /// Controller.File() - 输出一个文件(文件地址)
        /// 返回类型为 FileContentResult
        /// </summary>
        public ActionResult FilePathResult()
        {
            var path = Request.PhysicalApplicationPath + "Content/loading.gif";
            return base.File(path, "image/gif");
        }

        // <summary>
        /**/
        /// Controller.File() - 输出一个文件(文件流)
        /// 返回类型为 FileContentResult
        /// </summary>
        public ActionResult FileStreamResult()
        {
            FileStream fs = new FileStream(Request.PhysicalApplicationPath + "Content/loading.gif", FileMode.Open);

            return base.File(fs, @"image/gif");
        }

        /**/
        /// <summary>
        /// HttpUnauthorizedResult - 响应给客户端错误代码 401(未经授权浏览状态),如果程序启用了 Forms 验证,并且客户端没有任何身份票据,则会跳转到指定的登录页
        /// </summary>
        public ActionResult HttpUnauthorizedResult()
        {
            return new HttpUnauthorizedResult();
        }

        /**/
        /// <summary>
        /// Controller.PartialView() - 寻找 View ,即 .ascx 文件
        /// 返回类型为 PartialViewResult
        /// </summary>
        public ActionResult PartialViewResult()
        {
            return base.PartialView();
        }

        /**/
        /// <summary>
        /// Controller.View() - 寻找 View ,即 .aspx 文件
        /// 返回类型为 ViewResult
        /// </summary>
        public ActionResult ViewResult()
        {
            // 如果没有指定 View 名称,则寻找与 Action 名称相同的 View
            return base.View();
        }

        /**/
        /// <summary>
        /// 用于演示处理 JSON 的
        /// </summary>
        public ActionResult JsonDemo()
        {
            return View();
        }

        /**/
        /// <summary>
        /// 用于演示上传文件的
        /// </summary>
        public ActionResult UploadDemo()
        {
            return View();
        }

        /**/
        /// <summary>
        /// 用于演示 Get 方式调用 Action
        /// id 是根据路由过来的;param1和param2是根据参数过来的
        /// </summary>
        [AcceptVerbs(HttpVerbs.Get)]
        public ActionResult GetDemo(int id, string param1, string param2)
        {
            ViewData["ID"] = id;
            ViewData["Param1"] = param1;
            ViewData["Param2"] = param2;

            return View();
        }

        /**/
        /// <summary>
        /// 用于演示 Post 方式调用 Action
        /// </summary>
        /// <remarks>
        /// 可以为参数添加声明,如:[Bind(Include = "xxx")] - 只绑定指定的属性(参数),多个用逗号隔开
        /// [Bind(Exclude = "xxx")] - 不绑定指定的属性(参数),多个用逗号隔开
        /// [Bind] 声明同样可以作用于 class 上
        /// </remarks>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult PostDemo(FormCollection fc)
        {
            ViewData["Param1"] = fc["param1"];
            ViewData["Param2"] = fc["param2"];

            // 也可以用 Request.Form 方式获取 post 过来的参数

            // Request.Form 内的参数也会映射到同名参数。例如,也可用如下方式获取参数 
            // public ActionResult PostDemo(string param1, string param2)

            return View("GetDemo");
        }

        /**/
        /// <summary>
        /// 处理上传文件的 Action
        /// </summary>
        /// <param name="file1">与传过来的 file 类型的 input 的 name 相对应</param>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UploadFile(HttpPostedFileBase file1)
        {
            // Request.Files - 获取需要上传的文件。当然,其也会自动映射到同名参数
            // HttpPostedFileBase hpfb = Request.Files[0] as HttpPostedFileBase;

            string targetPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory + "Upload", Path.GetFileName(file1.FileName));
            file1.SaveAs(targetPath);

            return View("UploadDemo");
        }
    }
}


原文地址:http://www.itmmd.com/201412/331.html
该文章由 萌萌的IT人 整理发布,转载须标明出处。

SQL Server 中 DELETE vs TRUNCATE TABLE   上一篇
下一篇  JavaScript 自动切换焦点、表单序列、富文本编辑(所见即所得)

精彩回复
发表评论
姓名:       

《程序员app》专门为程序员量身定做!