原文:https://blog.csdn.net/lxrj2008/article/details/79455360


ASP.NET mvc的Controller要正确的响应用户发出的请求就要获取到用户输入值和传递的参数信息,比如:查询参数的值,提交的表单的值或者通过路由系统从URL中获取的值等等。在ASP.NET MVC中有三种方式来获取访问这些值:

1、从Controller的上下文获取

2、从Action参数中获取

3、利用ASP.NET MVC的model 绑定特性

一、从Controller的上下文对象获取参数值

一旦创建的Controller是从基类Controller中继承的就可以通过Controller的上下文获取参数信息,基类Controller我们提供了很多属性: Request,  Response ,  RouteData,  HttpContext, and  Server,每一个属性都是Controller的上下文对象,它们各针对不同方面信息。利用这些对象可以获取到当前请求的相关变量的值。

比如下面的一个Action方法:

public ActionResult RenameProduct() {
// 通过上下文对象获取变量的值
string userName = User.Identity.Name;
string serverName = Server.MachineName;
string clientIP = Request.UserHostAddress;
DateTime dateStamp = HttpContext.Timestamp;
AuditRequest(userName, serverName, clientIP, dateStamp, "Renaming product");
// 通过上下文的请求对象获取表单提交的参数值
string oldProductName = Request.Form["OldName"];
string newProductName = Request.Form["NewName"];
bool result = AttemptProductRename(oldProductName, newProductName);
ViewData["RenameResult"] = result;
return View("ProductRenamed");
}

二、通过Action参数中获取参数值

在Controller的Action方法可以带有参数,ASP.NET MVC框架会自动从请求的上下文中提取这些参数的值分别对应到Action的参数。这也是可读性最好和最简介的方式。

假设之前我们是通过请求下文对象来获取参数的值:

public ActionResult ShowWeatherForecast() {
string city = (string)RouteData.Values["city"];
DateTime forDate = DateTime.Parse(Request.Form["forDate"]);
// ... implement weather forecast here ...
return View();
}
接下来我们可能通过Action参数对上面进行改进:
public ActionResult ShowWeatherForecast(string city, DateTime forDate) {
// ... implement weather forecast here ...
return View();
}
可以看出采用通过Action参数的方式大大的减少了代码量和提高了可读性。使用参数的形式还有一个好处是利于单元测试,因为我们不用创建一个RouteData和Request对象,直接传递对应参数就可以测试。MVC框架通过检查请求上下文对象为这些参数提供值,其中包括以下集合: Request.QueryString, Request.Form , RouteData.Values 注意:Action参数是不区分大小写的,比如:Action有一个参数为city,我们可以通过Request.Form["City"]获取到值。

三、利用ASP.NET MVC的model绑定特性获取参数值

基类Controller设置Action参数的值是通过MVC框架中的value providers和model binders两个组件完成的。MVC框架内置的value providers通过从集合, Request.Form,  Request.QueryString,  Request.Files, 和RouteData.Values获取值,然后传递给model binders分别映射到我们的Action相应的参数中去。默认的model binders就可以映射任何的.NET类型的参数,包括基本类型、集合类型和自定义的类。你可以看看我之前写的:ASP.NET MVC中默认Model Binder绑定Action参数为List、Dictionary等集合的实例,以后我会详细的介绍ASP.NET MVC的model绑定特性。

【部分】ASP.NET MVC的Controller接收输入详解的更多相关文章

  1. Asp.Net MVC学习总结之过滤器详解(转载)

    来源:http://www.php.cn/csharp-article-359736.html   一.过滤器简介 1.1.理解什么是过滤器 1.过滤器(Filters)就是向请求处理管道中注入额外的 ...

  2. ASP.NET MVC学习之模型验证详解

    ASP.NET MVC学习之模型验证篇 2014-05-28 11:36 by y-z-f, 6722 阅读, 13 评论, 收藏, 编辑 一.学习前的一句话 在这里要先感谢那些能够点开我随笔的博友们 ...

  3. Asp.Net MVC 扩展 Html.ImageFor 方法详解

    背景: 在Asp.net MVC中定义模型的时候,DataType有DataType.ImageUrl这个类型,但htmlhelper却无法输出一个img,当用脚手架自动生成一些form或表格的时候, ...

  4. ASP.NET MVC控制器Controller中参数

    前述文章参见:ASP.NET MVC控制器Controller 绪论 之前的控制器返回的均为常量字符串,接下来展示如何获取请求传来的参数,而返回"动态"的字符串. 可以在操作方法B ...

  5. Asp.net MVC 中Controller返回值类型ActionResult

    [Asp.net MVC中Controller返回值类型] 在mvc中所有的controller类都必须使用"Controller"后缀来命名并且对Action也有一定的要求: 必 ...

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

    原文:返璞归真 asp.net mvc (3) - Controller/Action [索引页] [源码下载] 返璞归真 asp.net mvc (3) - Controller/Action 作者 ...

  7. ASP.NET MVC中controller和view相互传值的方式

    ASP.NET MVC中Controller向view传值的方式: ViewBag.ViewData.TempData 单个值的传递 Json 匿名类型 ExpandoObject Cookie Vi ...

  8. ASP.NET MVC Controller激活系统详解1

    一.引言 好久没有写博客了,前一段时间学习了Controller激活的一篇很好的博文(链接),在此做个学习总结. 二.Controller 2.1 IController Controller类型直接 ...

  9. [置顶] MVC输出缓存(OutputCache参数详解)

    1.学习之前你应该知道这些 几乎每个项目都会用到缓存,这是必然的.以前在学校时做的网站基本上的一个标准就是1.搞定增删改查2.页面做的不要太差3.能运行(ps真的有这种情况,答辩验收的时候几个人在讲台 ...

随机推荐

  1. vue-组件化-插槽(slot)

    理解 Vue组件化中,当我们在设计一个组件的时候,可能会保留一部分,让使用者自定义的内容,比如: 导航栏组件中,右上角的分享按钮,左上角做菜单按钮 弹出框组件中,弹出框的提示内容等 ... 在这种场景 ...

  2. Java实现 LeetCode 687 最长同值路径(递归)

    687. 最长同值路径 给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值. 这条路径可以经过也可以不经过根节点. 注意:两个节点之间的路径长度由它们之间的边数表示. 示例 1: 输入: ...

  3. Java实现蓝桥杯算法提高 陶陶摘苹果

    试题 算法提高 陶陶摘苹果 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30 ...

  4. Java实现 蓝桥杯VIP 算法提高 连接乘积

    算法提高 连接乘积 时间限制:1.0s 内存限制:256.0MB 问题描述 192这个数很厉害,用它分别乘以1.2.3,会得到: 192 x 1 = 192 192 x 2 = 384 192 x 3 ...

  5. Java实现 LeetCode 8 字符串转换整数(atoi)

    8. 字符串转换整数 (atoi) 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止. 当我们寻找到的第一个非 ...

  6. Java实现 基础算法 百元买百鸡

    public class 百元买百鸡 { public static void main(String[] args) { //母鸡 for (int i = 1; i < 33; i++) { ...

  7. 移除VS解决方案中的TFS版本控制

    项目每次会弹出提示 正在打开的解决方案已绑定到以下 Azure DevOps Server 上的源代码管理: xxxxx.是否要联系此服务器以尝试启用源代码管理集成? 移除VS解决方案中的TFS版本控 ...

  8. 运行npm run start 提示primordials is not defined

    下载https://github.com/ant-motion/editor-list 执行 npm install npm start gulp构建时报错. 原因:安装gulp版本与node版本不兼 ...

  9. mysql基础-数据库表简单查询-记录(五)

    0x01 MySQL的查询操作 单表查询:简单查询                 多表查询:连续查询                联合查询 选择和投影 投影:挑选要符合的字段     select ...

  10. Centos7 搭建KVM并创建Linux Windows虚拟机

    一.安装KVM   查看系统版本 cat /etc/redhat-release     关闭防火墙及selinux   systemctl disable firewalld.service 查看防 ...