asp.net mvc操作方法负责执行请求并生成响应。默认情况下,它以actionresult
的形式生成响应。操作通常具有与用户交互的一对一映射。
例如,在浏览器中输入一个url,点击任何特定的链接,提交表单等。这些用户交互中的每一个都会导致请求被发送到服务器。 在每种情况下,请求的url都包含mvc框架用来调用操作方法的信息。动作方法的一个限制是它们必须是实例方法,所以它们不能是静态方法。也没有返回值的限制。 所以可以返回字符串,整数等。
动作是mvc应用程序中的最终请求目标,它使用控制器基类。我们来看看请求处理。
当url到达时,如/home/index
,这是一个urlroutingmodule
,它检查并理解路由表中配置的内容并知道如何处理该url。
urlroutingmodule
将在路由表中配置的信息放在一起,并将控制交给mvc路由处理程序。
mvchandler
。mvchandler
使用一个控制器工厂实例化控制器,它知道实例化哪个控制器,因为它在该控制器值的routedata
中查找。mvchandler
有一个控制器,mvchandler
唯一知道的就是icontroller
接口,所以它只是告诉控制器执行。execute
方法创建一个动作调用者,并告诉动作调用者去找到一个方法来调用,找到一个调用的动作。routedata
中查找并找到从路由引擎传递的动作参数。动作基本上返回不同类型的动作结果。actionresult
类是所有操作结果的基础。 以下是不同种类的行为结果及其行为的列表。
编号 | 名称 | 行为 |
---|---|---|
1 | contentresult |
返回一个字符串 |
2 | filecontentresult |
返回文件内容 |
3 | filepathresult |
返回文件内容 |
4 | filestreamresult |
返回文件内容 |
5 | emptyresult |
什么都不返回 |
6 | javascriptresult |
返回脚本执行 |
7 | jsonresult |
返回json格式的数据 |
8 | redirecttoresult |
重定向到指定的网址 |
9 | httpunauthorizedresult |
返回403 http状态码 |
10 | redirecttorouteresult |
重定向到不同的动作/不同的控制器动作 |
11 | viewresult |
作为视图引擎的响应收到 |
12 | partialviewresult |
作为视图引擎的响应收到 |
我们来看看前一章(asp.net mvc控件器的mvccontrollerdemo项目)中创建employeecontroller
的一个简单示例。参考以下示例代码 -
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;
namespace mvccontrollerdemo.controllers {
public class employeecontroller : controller{
// get: employee
public actionresult search(string name){
var input = server.htmlencode(name);
return content(input);
}
}
}
当请求以下url:http://localhost:51066/employee/maxsu
时,将收到操作的输出如下 -
现在,在项目上再添加另一个控制器。
第1步 - 通过在解决方案资源管理器 中右键单击 controllers
文件夹来添加一个:控制器:customercontroller
。选择:添加 -> 控制器 。如下所示 -
它将显示“添加基架” 对话框。如下所示 -
第2步 - 选择mvc 5控制器 - 空 选项,然后单击“添加” 按钮。添加控制器对话框将出现。
第3步 - 将名称设置为:customercontroller
,然后单击“添加” 按钮。
现在,已经在controllers文件夹中看到一个新的 c# 文件“customercontroller.cs” ,在visual studio中打开并进行编辑,如下所示 -
同样,再添加一个名为homecontroller的控制器。 以下是homecontroller.cs类的实现。参考代码 -
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;
namespace mvccontrollerdemo.controllers
{
public class homecontroller : controller
{
// get: home
public string index()
{
return "this is home mvccontrollerdemo.homecontroller.index() action.";
}
}
}
第4步 - 运行此应用程序,将收到以下输出 -
第5步 - 在上面创建的customercontroller.cs类中添加一个方法,如以下代码 -
public string getallcustomers(){
return @"<ul>
<li>max su</li>
<li>mark jasper</li>
<li>allan java</li>
<li>ruby jerry</li>
</ul>";
}
第6步 - 运行该应用程序并请求url: http://localhost:51066/customer/getallcustomers
,将看到以下输出 -
也可以重定向到同一控制器的操作,甚至是不同的控制器。以下是一个简单的例子,将通过使用以下代码更改homecontroller
中的代码,从homecontroller
重定向到customercontroller
。
using system;
using system.collections.generic;
using system.linq;
using system.web;
using system.web.mvc;
namespace mvccontrollerdemo.controllers
{
public class homecontroller : controller
{
// get: home
public actionresult index()
{
return redirecttoaction("getallcustomers", "customer");
}
}
}
上面代码中,使用了redirecttoaction()
方法,它有两个参数:操作名称和控制器名称。
当运行这个应用程序时,会看到默认路由将重定向到/customer/getallcustomers