Asp.Net MVC(控制器、控制器动作和动作结果) - Part.3

article/2025/10/15 15:11:50

来自  张子阳:http://www.cnblogs.com/JimmyZhang/archive/2009/01/03/1367644.html

这篇教程探索了ASP.NET MVC控制器(controller)、控制器动作(controller action)和动作结果(action results)这几个主题。在读完本篇教程之后,你将会理解控制器如何控制访问者与ASP.NET MVC网站进行交互的方式。

1.理解控制器

MVC控制器负责响应对ASP.NET MVC网站发起的请求。每一个浏览器请求都映射到了一个专门的控制器。举个例子,设想一下你在浏览器地址栏输入了下面的URL:

http://localhost/product/index/3

在这种情况下,将会调用一个名为ProductController的控制器。ProductController负责生成对浏览器请求的响应。举个例子,控制器可能会返回一个特定的视图,或者是将用户重定向到另一个控制器。

你可以通过在ASP.NET MVC应用程序的Controllers文件夹下添加一个新的控制器来创建一个新控制器。右键点击控制器的文件夹,并且选择菜单项“Add(添加)”,“New(新建项)”,并选择“MVC Controller Class(MVC控制器类)”(见图1)。控制器的名字必须含有Controller后缀。举个例子,控制器名称ProductController没什么问题,但是控制器Product就不起作用。

图1 – 创建一个新的控制器

如果你创建一个新的名为ProductController的控制器,那么你将会获得代码清单1所示的文件。

代码清单1 – ProductController.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;
namespace MvcApp.Controllers {

     public class ProductController : Controller

     {  

         public ActionResult Index()

          {

               // Add action logic here

               throw new NotImplementedException();

          }

     }

}

如同你在代码清单1中所看到的,控制器不过是一个类(Visual Basic.Net 或者是C#类)。一个控制器是一个继承自System.Web.Mvc.Controller基类的类。因为控制器继承自这个基类,所以控制器轻松地继承了一些有用的方法(我们不久将会讨论这些方法)。

2. 理解控制器动作

控制器暴露出控制器动作。动作是控制器的一个方法,当你在浏览器地址栏输入某一特定的URL时,将会调用这个方法。举个例子,假设你对下面这个URL发出请求:

http://localhost/Product/Index/3

在本例中,Index()方法在ProductController类上被调用。Index()方法是控制器动作的一个例子。

一个控制器动作必须是控制器类的一个公共方法。C#方法,默认时,是私有方法。意识到你添加到控制器类中的任何公共方法都会自动被暴露为控制器动作(你必须非常小心,因为控制器动作可以被全球的任何人调用,仅仅简单地通过在浏览器地址栏输入正确的URL)。

控制器动作还要满足一些额外的需求。作为控制器动作来使用的方法不能够重载。另外,控制器动作不能为静态方法。除了这些以外,你可以将任何方法作为控制器动作来使用。

3. 理解控制器结果

控制器动作返回一种叫做动作结果(Action Result)的东西。动作结果是控制器动作返回给浏览器请求的东西。

ASP.NET MVC框架支持六种标准类型的动作结果:

  1. ViewResult – 代表HTML及标记。
  2. EmptyResult – 代表无结果。
  3. RedirectResult – 代表重定向到一个新的URL。
  4. RedirectToRouteResult – 代表重定向到一个新的控制器动作。
  5. JsonResult – 代表一个JSON(Javascript Object Notation)结果,它可以用于AJAX应用程序。
  6. ContentResult – 代表着文本结果。

所有这些动作结果都继承自ActionResult基类。

在大多数情况下,控制器动作 ViewResult。例如,代码清单2中的Index()控制器动作返回了一个ViewResult。

代码清单2 – BookController.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;
namespace MvcApp.Controllers {

     public class BookController : Controller

     {

          public ActionResult Index()

          {  

              return View();

          }

     }

}

当一个动作返回一个ViewResult,将会向浏览器返回HTML。代码清单2中的Index()方法向浏览器返回了一个名为Index.aspx的视图。

注意到代码清单2中的Index()动作并没有放回一个ViewResult()。而是调用了Controller基类的View()方法。通常情况下,你并不直接返回一个动作结果。而是调用Controller基类的下列方法之一:

  1. View – 返回一个ViewResult结果。
  2. Redirect – 返回一个RedirectResult 动作结果。
  3. RedirectToAction – 返回一个RedirectToAction动作结果。
  4. RedirectToRoute – 返回一个RedirectToRoute动作结果。
  5. Json – 返回一个JsonResult动作结果。
  6. Content – 返回一个ContentResult动作结果。

因此,如果你想向浏览器返回一个视图,你可以调用View()方法。如果你想要降用户从一个控制器动作重定向到另一个,你可以调用RedirectToAction()方法。举个例子,代码清单3中的Details()动作要么显示一个视图,要么将用户重定向到Index()动作,取决于Id参数是否含有值。

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;
namespace MvcApp.Controllers {

     public class CustomerController : Controller

     {

          public ActionResult Details(int? Id)

          {  

              if (Id == null)  

                   return RedirectToAction("Index");

               return View();

          }
          public ActionResult Index()

          {  

              return View();

          }

     }

}

ContentResult动作结果很特别。你可以使用ContentResult动作结果来将动作结果作为纯文本返回。举个例子,代码清单4中的Index()方法将消息作为了纯文本返回,而不是HTML。

代码清单4 – StatusController.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;
namespace MvcApp.Controllers {

     public class StatusController : Controller

     {

          public ContentResult Index()

          {

               return Content("Hello World!");

          }

     }

}

当调用StatusController.Index()动作时,并没有返回一个视图。而是向浏览器返回了原始的文本“Hello World!”。

如果一个控制器动作返回了一个结果,而这个结果并非一个动作结果 – 例如,一个日期或者整数 – 那么结果将自动被包装在ContentResult中。举个例子,当调用代码清单5中的WorkController的Index()动作时,日期将自动作为一个ContentResult返回。

代码清单5 – WorkerController.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Mvc;
namespace MvcApp.Controllers {

     public class WorkController : Controller

     {

          public DateTime Index()

          {

               return DateTime.Now;

          }

     }

}

代码清单5中的Index()动作返回了一个DateTime对象。ASP.NET MVC框架自动将DateTime对象转换为一个字符串,并且将DateTime值包装在一个ContentResult中。浏览器将会以纯文本的方式收到日期和时间。

4. 总结

这篇教程的目的是为你介绍ASP.NET MVC中控制器、控制器动作以及控制器动作结果的概念。在第一部分,你学习了如何向ASP.NET MVC项目中添加新的控制器。接下来,你学习了控制器的公共方法是如何作为控制器动作暴露给全世界的。最后,我们讨论了动作结果的各种不同类型,这些动作结果可以从控制器动作中返回。特别地,我们讨论了如何从控制器动作中返回一个ViewResult、RedirectToActionResult和ContentResult。

转载于:https://www.cnblogs.com/dean-Wei/archive/2013/04/02/2994947.html


http://chatgpt.dhexx.cn/article/0Ft5KFSJ.shtml

相关文章

1-IDEA从设置到插件你只用看这一篇

IDEA简介 1.1 为什么要取消工作空间? 答: 简单来说,IDEA不需要设置工作空间,因为每一个Project都具备一个工作空间!!对于每一个IDEA的项目工程(Project)而言,它的每一 个…

CSS学习135~164(盒子模型+PS基本操作+案例)

1 盒子模型 1.1 看透网页布局的本质 网页布局过程: 先准备好相关的网页元素,网页元素基本都是盒子Box。利用CSS设置好盒子样式,然后摆放到相应位置。往盒子里面装内容。 网页布局的核心本质:就是利用CSS摆盒子。 1.2 盒子模型(Box Model&#xff09…

网址导航7654推广

hao123网址导航 有效结算规则 1、一个真实的用户,通过浏览器访问主页,且有后续点击行为则为有效; 2、每个用户每天访问多次只记一次有效; 3、网吧和局域网环境下推广无效; 专属推广:http://hao123.7654.co…

U大师安装系统后,Chrome主页被7654导航劫持解决方法

用U大师重装系统后,觉得全新的系统是完美的,可是打开Chrome后,总是打开7654导航主页,觉得不完美了,后来就找到一个可以解决这个问题的办法,步骤如下: 1、打开浏览器 2、把7654导航主页关了&…

删除可恶的7654.com,7654导航篡改首页恢复,如何解决浏览器被7654劫持

删除可恶的7654.com,7654导航篡改首页恢复,如何解决浏览器被7654劫持,7654导航 怎么删除 删除可恶的7654.com,浪费了一上午才把它搞定了,需要三步,彻底清除,有疑问请加我微信gene-se 1.拷贝下面的文件,保存为bat文件,…

Python —— Numpy详细教程

NumPy - 简介 NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。 Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。…

最全的NumPy教程

译者:飞龙 译文:https://www.jianshu.com/p/57e3c0a92f3a 原文:https://www.tutorialspoint.com/numpy/index.htm NumPy - 简介 NumPy 是一个 Python 包。它代表 “Numeric Python”。它是一个由多维数组对象和用于处理数组的例程集合组成的库…

numpy教程:数组操作

http://blog.csdn.net/pipisorry/article/details/39496831 Array manipulation routines numpy数组基本操作,包括copy, shape, 转换(类型转换), type, 重塑等等。这些操作应该都可以使用numpy.fun(array)或者array.fun()来调用。 Basic o…

numpy 学习

# numpy 学习 1.了解numpy 特性 2.掌握numpy的使用方法 numpy 官网地址 https://numpy.org/ NumPy简介 NumPy(NumericalPython)是Python数据分析必不可少的第三方库,NumPy的出现一定程度上解决了Python运算性能不佳的问题,同时…

numpy学习

1.Numpy的核心array对象以及创建array的方法 Numpy的核心数据结构,就叫做array就是数组,array对象可以是一维数组,也可以是多维数组;Python的List也可以实现相同的功能,但是array比List的优点在于性能好、包含数组元数…

【NumPy教程】(快速入门版)

文章目录 读者阅读条件 NumPy是什么NumPy使用需求NumPy应用场景 NumPy下载与安装Windows系统安装MacOSX系统安装Linux系统安装1) Ubuntu/Debian2) Redhat/CentOS NumPy ndarray对象创建ndarray对象ndim查看数组维数reshape数组变维 NumPy数据类型数据类型对象数据类型标识码定义…

NumPy教程(Numpy基本操作、Numpy数据处理)

Numpy 属性 介绍几种 numpy 的属性: • ndim:维度 • shape:行数和列数 • size:元素个数 使用numpy首先要导入模块 import numpy as np #为了方便使用numpy 采用np简写 列表转化为矩阵: python array np.array([[1,2,3],[2,3,…

【Python】Python之Numpy的超实用基础详细教程

Numpy在python中属于非常常用的包,无论是机器学习搭配pandas,还是数据可视化搭配pylab都是很正常的搭配。 Numpy numpy的官方中文文档:NumPy 中文 NumPy是使用Python进行科学计算的基础软件包。除其他外,它包括: 功…

numpy入门详细教程(一)

本讲主要介绍对numpy库和numpy库的N维数组对象:ndarray的基本了解。更多内容请看numpy入门详细教程(二) numpy: NumPy是一个开源的Python科学计算基础库,包含: • 一个强大的N维数组对象 ndarray • 广播功能函数 • 整合C/C/Fortran代码的工具 • 线性代数、傅里…

Python基础 Numpy菜鸟教程

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早是由 Jim Hugunin 与其它协作者共同开发,2005 年,Travis Oliphant…

Numpy教程(一)

参考资料:清华计算机博士带你学-Python金融量化分析 目录 demo1-numpy与for循环对比 demo2-向量内(点)积求和(对应位置相乘) demo3-ndarray常见属性 demo4-数组的创建 demo5-批量运算 demo6-索引与切片 demo7-布…

NumPy进阶教程——超详细

Numpy基础教程: https://blog.csdn.net/qq_43328040/article/details/106601065 ———————————————————————————————————— 文章目录 一.ndarray对象内幕1.1 Numpy dtype 层次结构 二.高阶数组操作2.1重塑数组2.2 C顺序和Fortran…

Numpy安装教程

一、查看自己的python版本 使用winR弹出搜索框,输入cmd打开命令提示符,在其中输入python并按回车,得到以下结果 查看自己使用的python版本 二、下载对应的Numpy版本 Python Extension Packages for Windows - Christoph Gohlke (uci.edu) 可…

Python Numpy库教程(超详细)

1 Numpy概述 1.1 概念 Python本身含有列表和数组,但对于大数据来说,这些结构是有很多不足的。由于列表的元素可以是任何对象,因此列表中所保存的是对象的指针。对于数值运算来说这种 结构比较浪费内存和CPU资源。至于数组对象,它…

Python基础(十) | Numpy详细教程

⭐本专栏旨在对Python的基础语法进行详解,精炼地总结语法中的重点,详解难点,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握python编程,同时为后续的数据分析,机器学习及深度学习的代码能力打下坚实…