ASP.NET MVC添加新控制器示例

ASP.NET MVC高效构建Web应用- 商品搜索 - 京东

控制器(Controllers)是一个协调视图和模型直接关系的特殊类。它响应用户输入,与模型进行对话,并决定呈现哪个视图(如果有的话)。在ASP.NET MVC中,这个类文件通常以后缀名Controller表示。让我们从新建一个控制器类开始动手。

3.2.1  新建项目添加控制器源文件

我们首先将新建一个MVC项目,后续内容就基于此项目逐渐新增内容展开讲解。

【例3.1】添加一个新控制器

(1)打开VS,新建一个基于MVC的ASP.NET项目,项目名称是test。

(2)我们从创建控制器类开始。在解决方案资源管理器中,右键单击 Controllers文件夹,然后单击“添加”,再单击“控制器”,此时出现“添加已搭建基架的新项”,在该对话框上,我们单击“MVC 5 控制器- 空”,如图3-2所示。

图3‑2

然后单击“添加”。将新控制器命名为“HelloWorldController”,如图3-3所示。

图3‑3

然后单击“添加”。此时,解决方案资源管理器将创建名为HelloWorldController.cs的新文件和一个新文件夹Views\HelloWorld,位置如图3-4所示。

图3‑4

(3)在控制器中准备添加代码。我们在解决方案资源管理器中双击打开控制器源文件HelloWorldController.cs,然后删除类HelloWorldController下的Index函数,并添加两个新函数,代码如下:

public class HelloWorldController : Controller{// 访问方式:/HelloWorldpublic string Index() {return "This is my <b>default</b> action..."; //该字符串显示在网页上,<b>是粗体的意思}// 访问方式:/HelloWorld/Welcome/public string Welcome(){return "This is the Welcome action method..."; //该字符串显示在网页上}}

我们新增的控制器名称是HelloWorldController,第一个方法是Index,当我们访问控制器(http://localhost:xxxx/HelloWorld)时候,将默认调用这个Index方法,此时它返回一个字符串,因此在网页浏览器中能看到这个字符串。另外一个方法是Welcome,当我们在浏览器中访问URL地址“http://localhost:xxxx/HelloWorld/Welcome”时,将调用该方法,该方法也是返回一个字符串,因此我们可以在浏览器中看到这个字符串。

(4)按ctrl+F5运行项目,然后在弹出的浏览器的地址栏中输入“https://localhost:44308/HelloWorld”,此时就可以在页面上看到方法Index中返回的字符串了,如图3-5所示。

访问https://localhost:44308/HelloWorld相当于访问https://localhost:44308/HelloWorld/index,index可以省略不写。可以看出,网页上显示的字符串正是Index方法中返回的字符串,而且返回的字符串中带有的html标记<b></b>也起作用了,它的作用就是让<b>和</b>之间的字符变粗体。接着,我们再在浏览器地址栏中输入“https://localhost:44308/HelloWorld/Welcome”,此时将调用HelloWorldController控制器中的Welcome方法,该方法也是返回一个字符串,因此网页上也能看到一个字符串,如图3-6所示。

     

可见结果正确。另外,在ASP.NET MVC中,默认情况下,路由解析是不区分大小写的,因此我们在地址栏中把“HelloWorld/Welcome”全部写成小写,也是可以正常显示网页。如果需要让MVC的路由匹配变得大小写敏感,你可以通过在RouteConfig.cs中定义路由的时候使用正则表达式来实现,但通常没有必要。

现在我们理解了,ASP.NET MVC 根据传入 URL 调用不同的控制器类,并调用不同的操作方法(比如我们例子中的Index方法和Welcome方法)。

3.2.2  基于路由为方法增加一个参数

至此,我们并没有传递参数给Welcome方法,实际开发中,通常会在URL中传递一些数据给内部方法,那我们要传数据给方法,URL如何写呢?可以这样写:

/[Controller]/[ActionName]/[Parameters]

Controller表示控制器名称,ActionName表示方法名称,Parameters表示要传给方法的参数,比如http://localhost:xxx/HelloWorld/Welcome/1,这个1就是可以传给Welcome方法的参数。那为何可以这样写呢?这个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格式,而且参数的名称也规定了,即id。那么我们在方法中也要定义一个名称为id的参数,然后就可以得到URL中的参数值了。

我们看url那一行,{id}处在参数的位置上,表示要传给方法action的参数,我们只需要在。defaults表示如果URL中不写具体的方法名称,那么默认访问的方法就是Home控制器中Index,而且参数是可选的(UrlParameter.Optional),也就是可以没有,这样我们运行应用程序但不提供任何 URL 段时,它默认为在上述代码的defaults 节中指定的Home控制器和Index操作方法。注意:Home控制器是新建项目就默认生成的,我们手动添加的控制器是HelloWorld。

了解了格式后,我们趁热打铁,赶紧在Welcome方法中添加一个参数,代码如下:

public string Welcome(int id){return HttpUtility.HtmlEncode("data from url:"+ id);}

我们要把参数id在网页上显示出来。HttpUtility.HtmlEncode用于将字符串转换为HTML编码格式的字符串,目的是为了保护应用程序免受恶意输入(因为我们的程序通过URL接收输入参数,所以要做好一定的防护),因此我们需要通过对字符串应用HTML 编码以防在Web应用程序中受到脚本攻击。

运行项目,然后在浏览器的地址栏中输入URL:https://localhost:44308/HelloWorld/Welcome/100,回车后,网页就出现了“data from url:100”,如图3-7所示。

图3-7

可以看到,参数100传给了Welcome方法,然后在网页上显示出来,有兴趣的朋友还可以改100为其他数字,都可以正确显示出来。值得注意,Welcome方法中的参数名id必须和RegisterRoutes方法中{id}一致,如果Welcome方法中的参数名不是id,那就会出错了。但如果Welcome方法中写成了大写ID,那是没事的,结果照样正确,说明此方法对大小写不敏感。

有朋友可能会执拗,就偏要在Welcome方法中用其他参数名称,咋办?很简单,在RegisterRoutes方法中,把{id}改为你想要的名称,比如我们改为{age},那么我们在Welcome方法中就可以用age作为参数名了,我们马上试试。修改RegisterRoutes方法如下:

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

然后再修改Welcome方法如下:

public string Welcome(int age){return HttpUtility.HtmlEncode("data from url:"+ age);}

也就是把参数名改为了age,返回的字符串也用了age。

马上运行项目,输入URL:https://localhost:44308/HelloWorld/Welcome/66,运行结果如图3-8所示。

图3‑8

运行正确,现在我们知道如何使用自己想用的参数名了,原来需要在注册路由方法RegisterRoutes中修改一下。

3.2.3  基于路由为方法增加多个参数

刚刚我们把URL上的参数传递给了方法Welcome,但我们只是传递了一个参数,现在我们来传递多个参数。首先我们要在路由配置文件RouteConfig.cs中添加一个新路由,添加代码如下:

routes.MapRoute(name: "abc",url: "{controller}/{action}/{name}/{height}/{age}");

这里的路由名称name随便取,比如abc;最关键的是url,这里我们在{action}后面添加了3个参数,分别是name、height和age,它们将传入方法Welcome中,因此接下来我们要为Welcome方法添加参数,打开HelloWorldController.cs,修改Welcome方法如下所示:

public string Welcome(string name,float height, int age = 10){return HttpUtility.HtmlEncode("Hello " + name + ", your height:"+height+" and age:"+age);}

马上运行项目,输入URL:https://localhost:44308/HelloWorld/Welcome/Tom/1.81/20,运行结果如图3-9所示。

图3-9

运行正确,我们把3个参数值都显示出来了。现在,我们知道如何传多个参数给方法了。

在路由配置文件RouteConfig.cs中,拥有2个条路由,一条是名为Default的路径,另外一条是名为abc的路径。我们可以按两种url来访问,但前提是要定义好和url参数对应的方法。比如现在按照Default中的url(url: "{controller}/{action}/{age}")方式来访问就出错了,输入URL:https://localhost:44308/helloWorld/Welcome/22,运行结果如图3-10所示。

这是因为Welcome需要3个参数呢,而我们在URL中就给了一个参数,所以报错了。我们可以在HelloWorldController类中增加一个方法,使其拥有一个参数,代码如下:

public string howold(int age){return HttpUtility.HtmlEncode("age:" + age);}

然后运行项目,输入URL:https://localhost:44308/helloWorld/howold/22,运行结果如图3-11所示。

   

运行正确。现在我们既可以输入1个参数,也可以输入3个参数给不同的方法了,两种URL路径都能使用到。

3.2.4  不改变路由为方法增加多个参数

刚刚我们为了传递多个参数给方法,还特意添加了一条新路由,略显繁琐,其实也可以不新增路由来传递多个参数的。方法是通过查询字符串。现在我们基于已经存在的路由Default,来为Welcome方法添加多个参数,目前Default路由是这样的:

routes.MapRoute(name: "Default",url: "{controller}/{action}/{age}",defaults: new { controller = "Home", action = "Index", age = UrlParameter.Optional });

age已经是一个参数了,它所需要的URL如下:

http://localhost:xxx/HelloWorld/Welcome/20

现在,我们可以在1后面加问号(?),然后再加查询字符串,比如:

http://localhost:xxx/HelloWorld/Welcome/20?name=Tom&height=1.81

“name=Tom&height=1.81”就是查询字符串,name和height是参数名,必须和Welcome方法中的参数名相同,Tom和1.81是参数值,也就是传给Welcome方法的实参。而Welcome方法目前的代码是这样的:

public string Welcome(string name,float height, int age = 10){return HttpUtility.HtmlEncode("Hello " + name + ", your height:"+height+" and age:"+age);}

正好3个参数,name和height对应查询字符串中name和height,age对应Default路径中url规定的age。运行项目,输入URL:https://localhost:44308/helloWorld/Welcome/20?name=Alice&height=1.68,运行结果如图3-12所示。

图3-12

运行正确。通过查询字符串的方式,我们即使不新增路由,也可以给方法传递多个参数值。不信的话,可以把路由abc删除,结果依然正确。但要注意,查询字符串会在URL中暴露参数名称。

这个实例写到这里该结束了,否则太长了。在整个实例中,控制器一直在执行 MVC的VC部分,即视图和控制器的工作。控制器将直接返回 HTML。通常,人们不希望控制器直接返回 HTML,因为这会使代码变得非常繁琐。相反,我们通常使用单独的视图模板文件来帮助生成HTML响应,后续我们将实现这个效果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82817.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Escrcpy(安卓手机投屏软件) v1.29.6 中文绿色版

在数字设备日益普及的今天&#xff0c;用户对于设备的控制和管理需求也在不断增加。对于Android设备用户来说&#xff0c;Escrcpy这款强大的工具无疑是一个福音。它不仅提供了直观的图形化界面&#xff0c;让用户能够轻松显示和控制自己的Android设备&#xff0c;还以完全免费开…

Python爬虫实战:研究Goose框架相关技术

一、引言 随着互联网的迅速发展,网络上的信息量呈爆炸式增长。从海量的网页中提取有价值的信息成为一项重要的技术。网络爬虫作为一种自动获取网页内容的程序,在信息收集、数据挖掘、搜索引擎等领域有着广泛的应用。本文将详细介绍如何使用 Python 的 Goose 框架构建一个完整…

【Linux 学习计划】-- 冯诺依曼体系 | 操作系统的概念与定位,以及其如何管理软件

目录 冯诺依曼体系结构 操作系统是干什么的&#xff1f; 理解操作系统中的管理 对OS&#xff08;操作系统&#xff09;宏观、整体的分析 总结 结语 冯诺依曼体系结构 首先我们来看这样一张图&#xff0c;这就是大名鼎鼎的冯诺依曼体系 在日常生活中&#xff0c;所有的计…

新消息!阿里云ACP大模型认证有变化!

阿里云ACP认证是阿里云认证中的高级工程师&#xff0c;ACP认证方向有云计算、大数据、人工智能、大模型等多个&#xff0c;大家都知道&#xff0c;阿里云ACP考试题量共100题&#xff0c;其中70道单选题30道多选题&#xff0c;每题一分&#xff0c;满分100分&#xff0c;80分合格…

MySQL 数据迁移Postgresql(openGuass) 之 pg_chameleon

1 pg_chameleon 介绍 pgchameleon 是一款MySQL 到 PostgreSQL/openGuass 的复制工具。 pg_chameleon 使用场景&#xff1a; 1&#xff09;分析 2&#xff09;迁移 3&#xff09;对多个MySQL 数据库进行数据聚合 操作系统信息 (myenv) rootu24-pg-60:~# cat /etc/issue Ubuntu …

Spark 中,map和foreach的区别

在 Spark 中&#xff0c;map和foreach是两种不同用途的转换操作&#xff0c;主要区别在于&#xff1a; 1. 操作类型与返回值 map&#xff1a;是转换操作&#xff08;Transformation&#xff09;&#xff0c;返回一个新的 RDD。foreach&#xff1a;是行动操作&#xff08;Acti…

More SQL(Focus Subqueries、Join)

目录 Subqueries Subqueries That Return One Tuple Subqueries and Self Connection The IN Operator The Exists Operator The Operator ANY The Operator ALL Union, Intersection, and Difference&#xff08;交并差&#xff09; Bag Semantics Controlling Dupl…

OpenGL Chan视频学习-4 Vertex Buffers and Drawing a Triangle in OpenGL

一、视频链接 【最好的OpenGL教程之一】https://www.bilibili.com/video/BV1MJ411u7Bc?p5&vd_source44b77bde056381262ee55e448b9b1973 二、相关网站 docs.gl 三、代码整理 c #include <GL/glew.h> #include <GLFW/glfw3.h>#include<iostream>int…

WSL中ubuntu通过Windows带代理访问github

WSL中ubuntu通过Windows带代理访问github 前言: WSL是Windows下的ubuntu访问工具&#xff0c;目前无法访问外网&#xff0c;因此需要配置一下。 步骤一 代理中进行如下设置: 步骤二 ubuntu22.04中修改配置 使用如下命令获取IP地址&#xff1a; ip route | grep default | aw…

为(FramePack)的视频生成添加首尾帧功能

文章目录 &#xff08;一&#xff09;前言&#xff08;二&#xff09;可选的尾帧&#xff08;三&#xff09;测试&#xff08;四&#xff09;例子 &#xff08;一&#xff09;前言 前提是这个&#xff1a;《笔记本6GB本地可跑的图生视频项目&#xff08;FramePack&#xff09;…

C语言中:递归问题的深入研究

C语言中&#xff1a;递归问题的深入研究 函数的递归有两个限制条件&#xff1a; 1.递归存在限制条件&#xff0c;当满⾜这个限制条件的时候&#xff0c;递归便不再继续。 2.每次递归调⽤之后越来越接近这个限制条件。 例子&#xff1a; #include <stdio.h> int main…

《C++20新特性全解析:模块、协程与概念(Concepts)》

引言&#xff1a;C20——现代C的里程碑 C20是继C11之后最具革命性的版本&#xff0c;它通过模块&#xff08;Modules&#xff09;、协程&#xff08;Coroutines&#xff09;和概念&#xff08;Concepts&#xff09;三大核心特性&#xff0c;彻底改变了C的代码组织方式、并发模…

xcode卡死问题,无论打开什么程序xcode总是在转菊花,重启电脑,卸载重装都不行

很可能是因为我们上次没有正常关闭Xcode&#xff0c;而Xcode保留了上次错误的一些记录&#xff0c;而这次打开Xcode依然去加载错误的记录&#xff0c;所以必须完全删除这些记录Xcode才能加载正常的项目。 那么也就是说&#xff0c;我们是不是只需要删除这部分错误记录文件就可以…

华为云Flexus+DeepSeek征文|华为云Flexus云服务器X实例上部署Dify:打造高效的开源大语言模型应用开发平台

目录 前言 1 Dify与华为云部署概述 1.1 什么是 Dify 1.2 华为云与 Flexus 云服务器的优势 2 云服务器部署 Dify 的步骤详解 2.1 模板选择 2.2 参数配置 2.3 资源栈设置 2.4 确认部署信息并执行 3 部署成功后的操作与平台使用指南 3.1 访问平台 3.2 设置管理员账号 …

物流项目第九期(MongoDB的应用之作业范围)

本项目专栏&#xff1a; 物流项目_Auc23的博客-CSDN博客 建议先看这期&#xff1a; MongoDB入门之Java的使用-CSDN博客 需求分析 在项目中&#xff0c;会有两个作业范围&#xff0c;分别是机构作业范围和快递员作业范围&#xff0c;这两个作业范围的逻辑是一致的&#xf…

网络拓扑如何跨网段访问

最近领导让研究下跟甲方合同里的&#xff0c;跨网段访问怎么实现&#xff0c;之前不都是运维网工干的活么&#xff0c;看来裁员裁到动脉上了碰到用人的时候找不到人了&#xff0c; 只能赶鸭子上架让我来搞 IP 网络中&#xff0c;不同网段之间的通信需要通过路由器&#xff0c;…

【前端】PWA

目录 概述实战vue项目问题汇总 PWA&#xff08;渐进式 Web 应用&#xff0c;Progressive Web App&#xff09; 2015提出 概述 PWA 是一种提升 Web 应用体验的技术&#xff0c;使其具备与原生应用相似的功能和性能。PWA不仅能够在网页上运行&#xff0c;还能在手机或桌面上像传…

湖北理元理律师事务所:从法律合规到心灵契合的服务升维

债务优化不仅是数字游戏&#xff0c;更是信任重建的过程。湖北理元理律师事务所在实践中发现&#xff1a;68%的债务纠纷中存在沟通断裂。为此&#xff0c;机构构建了“三维信任修复机制”。 维度一&#xff1a;信息透明的技术实现 区块链存证舱&#xff1a;客户手机实时查看律…

香橙派3B学习笔记2:Vscode远程SSH登录香橙派_权限问题连接失败解决

Vscode下载插件&#xff0c;ssh远程登录香橙派。 ssh &#xff1a; orangepi本地ip 密码 &#xff1a; orangepi 安装 Remote - SSH 扩展SSH插件&#xff1a; SSH远程连接&#xff1a; ssh usernameremote_host ssh -p port_number usernameremote_host默认22端口号就用第一行…

VMware安装Ubuntu实战分享大纲

深入解析快速排序 一、分治策略分解 分解阶段&#xff1a; 选择基准元素 $pivot$将数组划分为三个子集&#xff1a; $$ left {x | x < pivot} $$ $$ equal {x | x pivot} $$ $$ right {x | x > pivot} $$ 递归排序&#xff1a; 对 left 和 right 子集递归调用快速排…