目录
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的好处
-
使代码变得更加简洁
-
帮助我们获取HTTP请求中的数据
-
帮助我们完成必要的数据类型转换
详细介绍
标题: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里面,用一次就清掉