目录

​1.路由传参​

​2.“问号?”传参​

​3.表单form传参​

​4.通过route特性路由传参​

​5.重点FormCollection使用​

​视图赋值​


1.路由传参

视图传参代码:

<a href="chuanzhi_luyou/666666">路由传值</a>

控制器代码:

public ActionResult ChuanZhi_LuYou()
{
/*
* =========【取值方法一(获取路由信息)】=========
* RouteData.Values["id"]
* RouteData.Values["变量"] 获取路由信息
* */


/*
* ViewData["Request_id"]
* ViewBag.Request_id (动态类型)
* 向视图传递参数有ViewData["变量"]和ViewBag."变量"两种
* */

ViewBag.RouteData_Values_id = RouteData.Values["id"].ToString();
return View();
}

视图取参代码:

<h1>路由传值</h1>
<h5>ViewBag.RouteData_Values_id=@ViewBag.RouteData_Values_id</h5>

2.“问号?”传参

视图传参代码:

<li><a href="chuanzhi_wenhao?id=666666">?传值</a></li>

控制器代码:

public ActionResult ChuanZhi_WenHao()
{
/*
* =========【取值方法二(获取"?"问号传参)】=========
* Request["id"].ToString();
* Request["变量"]取值方式可以获取get和post两种
* =========【取值方法三(获取"?"问号传参)】=========
* Request.QueryString["id"]
* */

/*
* ViewData["Request_id"]
* ViewBag.Request_id (动态类型)
* 向视图传递参数有ViewData["变量"]和ViewBag."变量"两种
* */


ViewData["Request_id"] = Request["id"].ToString();
ViewBag.Request_id = Request["id"].ToString();

ViewData["Request_QueryString_id"] = Request.QueryString["id"];
ViewBag.Request_QueryString_id = Request.QueryString["id"];
return View();
}

视图取参代码:

<h1>?传值</h1>
<h5>ViewData["Request_id"]=@ViewData["Request_id"]</h5>
<h5>ViewBag.Request_id=@ViewBag.Request_id</h5>
<h5>ViewData["Request_QueryString_id"]=@ViewData["Request_QueryString_id"]</h5>
<h5>ViewBag.Request_QueryString_id=@ViewBag.Request_QueryString_id</h5>

3.表单form传参

视图传参代码:

<h1>form 传值</h1>
<form action="chuanzhi_biaodan" method="post">
用户名:<input type="text" name="Username"/>
<br />
密码:<input type="password" name="UserPassword"/>
<br />
<input type="submit" value="登录" />
</form>

控制器代码:

public ActionResult ChuanZhi_BiaoDan()
{

/*
* ViewData["Request_id"]
* ViewBag.Request_id (动态类型)
* 向视图传递参数有ViewData["变量"]和ViewBag."变量"两种
* */

ViewBag.UserName = Request["UserName"].ToString();
ViewBag.UserPassword= Request["UserPassword"].ToString();
return View();
}

视图取参代码:

<h1>form 传值</h1>
<h5>ViewBag.UserName=@ViewBag.UserName</h5>
<h5>ViewBag.UserPassword=@ViewBag.UserPassword</h5>

4.通过route特性路由传参

#region ==============通过route特性路由传参=============== 

/*【必须】启用路由特性映射
* MVC5可以通过路由配置文件(App_Start/RouteConfig.cs)增加下面代码
* routes.MapMvcAttributeRoutes();
*/

/// <summary>
/// 通过route特性路由传参[string]
/// 访问:http://localhost:53676/ChuanZhi/c_string/xiaoming
/// </summary>
/// <returns></returns>
[Route("ChuanZhi/c_string/{name}")]
public string ceshi_string(string name)
{
string status = string.Empty;
status = name;
return status;
}

/// <summary>
/// 通过route特性路由传参[int] 参数不可空
/// 访问:http://localhost:53676/ChuanZhi/c_int/1
/// </summary>
/// <returns></returns>
[Route("ChuanZhi/c_int/{proid:int}")]
public string ceshi_int(int proid)
{
int sum=proid+proid;
return $"{proid}+{proid}={sum}";
}

/// <summary>
/// 通过route特性路由传参[int] 参数可空
/// 访问:http://localhost:53676/ChuanZhi/c_int/1
/// </summary>
/// <returns></returns>
[Route("ChuanZhi/c_int2/{proid?}")]
public string ceshi_int2(int proid=1)
{
int sum=proid+proid;
return $"{proid}+{proid}={sum}";
}
#endregion

5.重点FormCollection使用

概述:

FormCollection用来在controller中获取页面表单元素的数据。它是表单元素的集合,包括<input type="submit" />元素。

用法举例:

以下是使用Razor语法的一个表单:

@using (Html.BeginForm())
{
@Html.TextBox("AAA")
@Html.CheckBox("BBB")
<input type="submit" name="submit" value="提交">
}

提交到后台ActionResult为:

[HttpPost]
public ActionResult Index(FormCollection form)
{
string a = form["AAA"];
string b = form["BBB"];
string c = form["submit"];
return View();
}

画重点

[HttpPost] //只接受Post提交
[ValidateInput(false)]//取消验证 ,主要是忽略:提交过来的表单携带的HTML代码
public ActionResult Index(FormCollection form)
{
string a = form["AAA"];
string b = form["BBB"];
string c = form["submit"];
return View();
}

此时可以得到a="",b="false",c="提交"。要注意的是使用form["AAA"]得到的都是string,需要进行类型转换。

FormCollection和Request.Form的区别:

推荐大家使用FormCollection,原因有以下两点:

1.前者便于单元测试:

对于Action进行单元测试时,使用FormCollection作为输入参数,比Request.Form简单,书写如下代码即可模拟一个FormCollection:

var form = new FormCollection();
form.Add("fieldName","fieldValue");

2.前者可支持MVC扩展:

Asp.net MVC在进行模型绑定时,会将用户输入绑定到FormCollection中,默认情况下,FormCollection中的内容与Request.Form一致,但是当我们自定义ModelBinder时,会影响FormCollection的取值,而Request.Form不会影响。这样如果我们在自定义ModelBinder时依旧使用Request.Form,自定义ModelBinder就毫无用处。

什么是ModelBinding

ASP.NET MVC中,所有的请求最终都会到达某个Controller中的某个Action并由该Action负责具体的处理和响应。为了能够正确处理请求,Action的参数(如果有的话),必须在Action执行之前,根据相应的规则,把请求中所包含的数据提取出来并将映射为Action的参数值,这个过程就是ModelBinding。ModelBinding的作用就是为Action提供参数列表。

ModelBinding的好处

  1. 使代码变得更加简洁
  2. 帮助我们获取HTTP请求中的数据
  3. 帮助我们完成必要的数据类型转换

详细介绍

标题:ASP.NET MVC5 ModelBinder

url:​ ​javascript:void(0)​

转载:FormCollection使用:​ ​javascript:void(0)​


视图赋值

向视图传递参数有ViewData["变量"]和ViewBag."变量"两种。

例如上面的ViewData["Request_id"]和ViewBag.Request_id,无论是双引号(“”)里的Request_id还是(.)后面的Request_id都是自定义的。最规范的命名方式是根据参数命名。

/*
*  ViewData["Request_id"]
*  ViewBag.Request_id (动态类型)
*  向视图传递参数有ViewData["变量"]和ViewBag."变量"两种
* */


ViewData :字典传值,里面是object,需要类型转换

ViewBag: dynamic(动态)传值,可以随便属性访问,运行时检测
以上二者是会覆盖的,以后者为准

model:适合复杂数据的传递,强类型

TempData:临时数据,可以跨action后台传递,存在session里面,用一次就清掉