3_MVC前台向后台传参和不同页面传
前台向后台传值
前台向后台传参数其实就是通过视图访问或刷新本页面时通过地址栏传参数给该页面或其它页面的控制器。
①表单传值
通过提交表单来实现传值,也可以在指定表单属性action来指定传到哪个控制器中,对应控制器使用Request来接收即可,不指定即默认传给自己的控制器。
在页面中Home的Index页面中写表单输入内容并提交到自己的控制器
<form><!--提交到News的Index视图,action="/News/Index",不写action默认提交到自己这个页面的控制器中-->
<input type="text" name ="username" />
<input type="submit" value="提交" />
<a href="/Home/About">关于我们</a>
</form>
可以看到点击提交的时候地址栏上有你传的变量名及值,如图:
你也可以不在文本框中输入,直接在地址栏输入文本框的name=要传的值,输了之后回车,这样和在文本框中输入再提交是一个效果。
后台接收
在指定的控制器根据地址栏上传过来的name名接收
//获取传过来的值
string name = Request["username"];
②地址栏传值
地址栏传值就直接在地址栏输入参数即可。注意变量名要和你控制器里接收的变量名一致。
③路由传值
路由传值也是通过地址栏完成的,只是它可以自己配置,传的时候满足配置格式地址栏就不会出现变量名,而是只有值,配置路由时controller和action和值之间用/隔开即可。
比如配置的路由格式如下:
url: "{controller}/{action}/{id}/{UserName}",//顺序可以乱写,但是还是尊重规则:比如"{controller}/{id}/{action}/{UserName}"
defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional, UserName = UrlParameter.Optional }
在访问或传值的时候就要在地址栏上按照你写的规则来,不然找不到页面
路由传值不是通过?传参的,如图:
在控制器接收路由传的值时,参数得按照你配置得格式来写,比如:配了两个参数,你控制器就至少有两个参数,当然,如果要多传参数,只能在后面写问号来传,因为你路由配置里就是两个参数,用/多传的话就会报404错。
多传参数使用?问号
控制器也是能接收的
如果你控制器里需要一个int类型的参数,最好在类型后面加个问号,表示可以为空,不然没有传参数会报错。下面就没加
在访问时不传任何参数时,错误如下图:
给不同页面跳转传值
方式一,传自己在控制器里写的值给另一个控制器
TempData:只能使用一次
①声明一个TempData,另一个控制器接收
public ActionResult Index()
{
//1给另一个页面传参数1
//访问本页面时会创建这个临时变量,只能被使用一次,
TempData["age"] = 21;
return RedirectToAction("About");
}
控制器调用
public ActionResult About()
{
int b=(int)TempData["age"];
int c = (int)TempData["age"];
//调用这个控制器的时候就会向前台传递TempData["age"]
//这个参数只能使用一次,刷新About页面就没了
return View(TempData["age"]);
}
②传一个匿名对象
//2给另一个页面传参数传匿名对象(路由传参),使用这种穿法对应的控制器就要在构造函数的参数里使用对象的属性的个数的参数来接收,名字也要一一对应
//About控制器的参数格式为:About(string id, string UserName,int age)
return RedirectToAction("About", new { id = "zs", UserName = "ssdf",age=15 });
或者
return RedirectToAction("Index", "Login", new
{
参数名称1="",
参数名称2=""
……
});
另一个控制器里接收
因为传的是对象,所有接收时参数必须和传过来的对象的属性一致
public ActionResult About(int? id, string UserName, string address)
{
return View();
}
这样传的时候满足了路由配置中的两个条件,所以两个参数会没有变量名,而且用的是/隔开,而最后一个就不满足路由配置,就用问号传,而且变量名也有。如果这个匿名对象少一个属性则能满足,如图:
③传一个指定对象
public class UserInfo
{
public string name { get; set; }
public int age { get; set; }
public string address { get; set; }
}
//About控制器的参数格式为:About(UserInfo user)
//这样穿的话地址栏最后会变成http://localhost:54575/Home/About?name=黄某&age=35&address=三国,因为它不满足配的路由的格式,所以会把变量名写出来
return RedirectToAction("About", new UserInfo() { name = "黄某", age = 35, address = "三国" });
控制器接收
public ActionResult About(UserInfo user)//参数类型和传的一致
{
return View();
}
这样没有一点满足配置的路由,所以地址栏传参格式如下:
方式而2,传自己在控制器里接收到的值给另一个控制器
比如:接收到的值为:封装为匿名对象传过去
public ActionResult Index(int? id, string UserName, string address)
{
//将接收到的数据传过去
return RedirectToAction("About", new { id = id, UserName = UserName, address = address });
}
//这个控制器用对应的参数接收即可
public ActionResult About(int? id, string UserName, string address)
{
return View();
}
Action之间传值,页面跳转传值
session
在没有过期的时候可以一直使用
template.
Template只能使用一次,临时变量,基于session实现。一次请求会销毁。只能使用一次,刷新了就没有了,也就是第一次请求中可以无限使用,之后就被销毁了,下次的请求也就没了,也就是刷新了就没了
比如:
在这个控制器里建一个TempData,然后跳转到About控制器
public ActionResult Index()
{
TempData["age"] = 21;
return RedirectToAction("About");
}
About控制器
public ActionResult About()
{
int b=(int)TempData["age"];//第一次请求时值为21
int c = (int)TempData["age"];//第一次请求时值为21
//调用这个控制器的时候就会向前台传递TempData["age"]
//这个参数只能使用一次,刷新About页面就没了
return View(TempData["age"]);
}
页面之间路由传参数
传递实体对象
传递匿名对象(临时使用)