传参方式:
1.路由传参:
格式:/ControllerName/ActionName/Parameter1/Parameter2 …
注意:必须要先配置对应的路由规则
例如:现在用理由传参的方式,传递两个参数
1-1:先在App_Start文件下的RouteConfig.cs路由配置文件中,配置路由规则
添加一个新的路由规则:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Web.Routing;
namespace MVC_Project02
{
public class RouteConfig
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
name: "Default",
url: "{controller}/{action}/{id}",
defaults: new { controller = "User", action = "Login", id = UrlParameter.Optional }
);
//配置路由传参规则
routes.MapRoute(
name: "Login",//唯一
url: "{controller}/{action}/{username}/{password}",
defaults: new { controller = "User", action = "CheckLogin", username = UrlParameter.Optional,password=UrlParameter.Optional }
);
}
}
}
在Login.cshtml视图文件中,添加路由传参的方式:
@*
路由传参:
使用前提:需要根据传递的参数的形式,先在RouteConfig.cs文件中,配置对应格式的路由规则
*@
<a href="/User/CheckLogin/Lara/lara894656" target="_blank">首页</a><br />
通过a标签的href属性可以看出,是调用User控制器下的CheckLogin动作方法,并传递两个路由参数,
那么又该如何在后头的Controller中的Action动作方法中获取那?
方式一:
Controller类的RouteData属性返回一个RouteData 的web类,可以RouteData类中的Values属性获取所有传递过来的路由参数的字典集合(RouteValueDictionary字典集合对象)
/*
获取以路由方式传递来的参数值
1.参数映射
2.使用 RouteData获取
*/
string username2 = RouteData.Values["username"].ToString();
string password2 = RouteData.Values["password"].ToString();
路由规则配置了路由参数名称,传递的时候,按顺序传递,底层会以key/value形式存储在字典集合中,获取时根据key获取对应的value。
第二种方法: 参数映射
在动作方法上,定义参数接收,参数名最好和配置的路由的参数名称一致
Demo:
路由:
routes.MapRoute(
name: "Pagination",
url: "{controller}/{action}/{pageSize}/{pageIndex}"
);
public ActionResult Index(int pageSize,int pageIndex)
{
.......................................
......................................
}
2.URL传参
格式:/ControllerName/ActionName?ParameterName1=ParameterValue1
&&ParameterName2=ParameterValue2…
在Login.cshtml视图文件中,添加URL传参的方式:
@*
url传参:使用"?"和"&&"拼接参数
*@
<a href="/User/CheckLogin?username=jane&&password=jiao7060158" target="_blank">首页</a><br />
在后台获取参数:
方式1:参数映射
形参名称和request请求参数名称一致,
则会将参数值注入到Action方法对应的形参
适合参数较少的情况
分析:
如果把路由的片段变量名作为动作方法的参数名,MVC框架会把路由系统获得的片段变量的值传递给动作方法的形参
片段变量名:配置的路由规则中的路由参数名称({action}/后面的参数)
public ActionResult CheckLogin(string username, string password)
{
........................................
}
方式二:对象参数映射
根据传递的参数,创建对应的实体类,属性(不区分大小写)—>参数
会将数据写入到对象中
public ActionResult CheckLogin(UserModel userModel)
{
.........................
}
方式三:直接使用Request对象获取url请求参数
Controller中的Request属性,返回的是一个HttpRequestBase类,是一个HTTP请求的基类,使用其Item[String]此属性可获取
string username2 = Request["username"];//支持get和post请求方式
string password2 = Request["password"];
URL请求参数,发送请求时,参数是会以key=value的形式存储到请求头中,然后发送到Controller中。
3.表单字段传参
以GET请求方式时,表单提交时,表单字段会以key=value(key为name属性名,value为字段值)的形式附加到url后.
在Login.cshtml视图文件中,添加表单:
<form class="loginform" action="/User/CheckLogin" method="get">
用户名:<input type="text" name="username" id="username" /> <br />
密码: <input type="password" name="password" id="password" /><br />
<input type="submit" value="提交" />
</form>
在后台Controller的Action动作方法中,获取表单数据:
1.支持参数映射(对象映射)
2.使用Request对象获取表单上的指定的字段值(name)
string username2 = Request["username"];//支持get和post请求方式
string password2 = Request["password"];
3.使用 Request.Form[“name”]获取,但只能获取post请求方式的表单数据
string username = Request.Form["username"];//只能处理post请求
string password = Request.Form["password"];
改为post请求方式后:成功获取
具体底层是用了哪些web类,查看微软官方的API文档: web api