[索引页]
[×××]


返璞归真 asp.net mvc (3) - Controller/Action


作者: webabcd


介绍
asp.net mvc 之 Controller 和 Action
  • Controller 类必须以字符串 "Controller" 做类名称的结尾,字符串 Controller 之前的字符串为 Controller 的名称,类中的方法名为 Action 的名称
  • Action 可以没有返回值。如果 Action 要有返回值的话,其类型必须是 ActionResult


示例
1、Controller/Action
ControllerDemoController.cs
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>
void Void() void Void()
                {
                        Response.Write( string.Format( "<span style='color: red'>{0}</span>", "void"));
                }

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

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

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

                /**//// <summary>
                /// Controller.Json() - 将指定的对象以 JSON 格式输出出来
                /// 返回类型为 JsonResult
                /// </summary>
ActionResult JsonResult() 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>
ActionResult JavaScriptResult() ActionResult JavaScriptResult()
                {
                        return base.JavaScript( "alert('JavaScriptResult')");
                }

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

                /**//// <summary>
                /// Controller.File() - 输出一个文件(字节数组)
                /// 返回类型为 FileContentResult
                /// </summary>
ActionResult FileContentResult() 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, "p_w_picpath/gif");
                }

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

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

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

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

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

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

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

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

                /**//// <summary>
                /// 用于演示 Get 方式调用 Action
                /// id 是根据路由过来的;param1和param2是根据参数过来的
                /// </summary>
                [AcceptVerbs(HttpVerbs. Get)]
ActionResult GetDemo() 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)]
ActionResult PostDemo() ActionResult PostDemo(FormCollection fc)
                {
                        ViewData[ "Param1"] = fc[ "param1"];
                        ViewData[ "Param2"] = fc[ "param2"];

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

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

                        return View( "GetDemo");
                }

                /**//// <summary>
                /// 处理上传文件的 Action
                /// </summary>
                /// <param name= "file1">与传过来的 file 类型的 input 的 name 相对应</param>
                [AcceptVerbs(HttpVerbs.Post)]
ActionResult UploadFile() 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");
                }
        }
}


2、Get 方式和 Post 方式调用 Controller 的 Demo
GetDemo.aspx
 
<%@ Page Title= "" Language="C# " MasterPageFile="~/Views/Shared/Site.Master " Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID= "Content1" ContentPlaceHolderID= "TitleContent" runat= "server">
        GetDemo
</asp:Content>
<asp:Content ID= "Content2" ContentPlaceHolderID= "MainContent" runat= "server">
        <h2>
                GetDemo</h2>
        <div>
                <%= ViewData[ "ID"] %></div>
        <div>
                <%= ViewData[ "Param1"] %></div>
        <div>
                <%= ViewData[ "Param2"] %></div>
                
        <form action= "/ControllerDemo/PostDemo" method= "post">
        <input id= "param1" name= "param1" />
         
        <input id= "param2" name= "param2" />
         
        <input type= "submit" value= "submit" />
        </form>
</asp:Content>


3、处理 JSON 的 Demo
JsonDemo.aspx
 
<%@ Page Title= "" Language="C# " MasterPageFile="~/Views/Shared/Site.Master " Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID= "Content1" ContentPlaceHolderID= "TitleContent" runat= "server">
        JsonDemo
</asp:Content>
<asp:Content ID= "Content2" ContentPlaceHolderID= "MainContent" runat= "server">

        <script src= "http://www.cnblogs.com/Scripts/jquery-1.3.2.js" type= "text/javascript"></script>

        <script type= "text/javascript">

                $.ajaxSetup({
                        cache: false
                });

                $(document).ready(
()() {

                                $( '#loading').hide();

                                $( '#btnFind').click(
()(event) {
                                                event.preventDefault();

                                                $( '#loading').show();

                                                $.getJSON(
                                                         "/ControllerDemo/JsonResult", // 获取 JSON
                                                        { name: $( '#txtName')[0].value },
()(data) {
                                                                $( '#result').append("name: ");
                                                                $( '#result').append(data.Name);
                                                                $( '#result').append(" - ");
                                                                $( '#result').append("age: ");
                                                                $( '#result').append(data.Age);
                                                                $( '#result').append("<br />");

                                                                $( '#loading').hide();
                                                        }
                                                )
                                        }
                                )
                        }
                )
                
        </script>

        <h2>
                JsonDemo</h2>
        <div style= "margin: 20px 0px">
                <input id= "txtName" value= "webabcd" />
                   <a href= "#" id= "btnFind">Find</a>    <span id= "loading" style="border: 1px solid #000000;
                        background-color: #FFFFCC; vertical-align: middle; padding: 6px">
                        <img src= "http://www.cnblogs.com/Content/Images/loading.gif" alt= "Loading" /> Loading</span>
                <div id= "result" style= "margin: 10px 0px" />
        </div>
</asp:Content>


4、上传文件的 Demo
UploadDemo.aspx
 
<%@ Page Title= "" Language="C# " MasterPageFile="~/Views/Shared/Site.Master " Inherits="System.Web.Mvc.ViewPage" %>

<asp:Content ID= "Content1" ContentPlaceHolderID= "TitleContent" runat= "server">
        UploadDemo
</asp:Content>
<asp:Content ID= "Content2" ContentPlaceHolderID= "MainContent" runat= "server">
        <h2>
                UploadDemo</h2>
        <!--action - 调用上传文件的 Action-->
        <form action= "/ControllerDemo/UploadFile" method= "post" enctype= "multipart/form-data">
        <input type= "file" id= "file1" name= "file1" />
        <input type= "submit" id= "upload" name= "upload" value= "上传" />
        </form>
</asp:Content>