2_MVC后台向前台传参

Razor语法

可以在cshtml里写C#代码,可以做到html和后台混编。就像aspx,jsp
输出@符合需要在cshtml里输入两个@,如:@@

向页面输出用@符即可
代码块用@{C#代码块或html元素}

与aspx的区别

1、混编的时候比aspx方便,比如:

在aspx里写for循环,里面再写一个if,因为aspx中<%里面只能出现C#代码,如果在循环判断打印html里的元素会很麻烦%>

而在Razor中就不一样了,Razor中的代码块里可以写html元素

MVC传值

要向某个页面通过后台传参数,只需要在该页面对应的控制器里写好值,然后传到 cshtml(视图)里就行了。

一、后台向前台传值

WebForm传值是在后台写public声明变量然后前台通过<%=变量名%>来获取后台的值。但是这样定义在公共区域并不好,不安全,页面多了容易影响,而且污染全局命名空间。

在MVC中原理类似,有四种传值方式,而且把要传的值放在控制器里,这样安全且不会占用全局命名空间。

①Viewdata

格式:ViewData[“键”] = 值;
通过这样传到后台后台只需要根据键的名字接收即可,访问页面时会自动传过去,不用写在return 后面的View()括号里就能传。

应用1:
传普通数据

//1通过Viewdata传参数1
ViewData["username"] = "xx";
return View();

前台cshtml接收

<!--前台通过ViewData["username"]取后台使用ViewData传过来的参数1-->
@ViewData["username"];

应用2:
通过Viewdata传集合
如果传过来的是一个集合,必须进行强制转换,因为ViewData是ViewDataDictionary的实例对象,ViewDataDictionary类并没有实现foreach接口,所以ViewData本身不支持便利,只有转换为list才能遍历

List<string> myList = new List<string>() { "葡萄", "香蕉", "西瓜", "木瓜", "哈密瓜", "西瓜", "香瓜" };
//1通过Viewdata传集合
ViewData["username2"] = myList;
return View();

前台接收

<!--前台通过ViewData["username2"]取后台使用ViewData传过来的参数-->
@{
        //传过来的是一个集合,必须进行强制转换,因为ViewData是ViewDataDictionary的实例对象,ViewDataDictionary类并没有实现foreach接口,
        //所以ViewData本身不支持便利,只有转换为list才能便利
        List<string> list = ViewData["username2"] as List<string>;
}
@{
    foreach (string item in list)
    {
        @item
    }
}

应用3:
通过Viewdata传对象类型集合


public class UserInfo
    {
        public string name { get; set; }
        public int age { get; set; }
        public string address { get; set; }
    }
 List<UserInfo> myList2 = new List<UserInfo>();
myList2.Add(new UserInfo() { name = "李清照", age = 23, address = "宋" });
myList2.Add(new UserInfo() { name = "黄月英", age = 18, address = "三国" });
myList2.Add(new UserInfo() { name = "黄忠", age = 50, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 27, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 35, address = "三国" });
//通过Viewdata传集合为对象类型
ViewData["username3"] = myList2;
return View();

前台调用
因为是对象类型,必须引入命名空间,可以直接在对象名前面加对象所在类的命名空间,也可以单独写一个using来调用。
第一种方式:

@using MvcApplication1.Models;----------方式1,这种方式导入了后面都能用
@List<MvcApplication1.Models.UserInfo>----------方式2,这种方式只能当前自己用
<!--前台通过ViewData["username3"]取后台使用ViewData传过来的参数3-->
@using MvcApplication1.Models;
<!--引入命名空间,因为要使用UserInfo的对象-->
@{
    //因为找不到UserInfo类,所以把类名写完整,也可以引入命名空间,
    //List<MvcApplication1.Models.UserInfo>
    //将ViewData转换为list,方便使用遍历
    List<UserInfo> list2 = ViewData["username3"] as List<UserInfo>;
    foreach (UserInfo item in list2)
    {
        <span>@item.name</span>
        <span>@item.age</span>
        <span>@item.address</span>
        <br />
    }
}



②通过ViewBag传参数

这种方法传需要在return 后面的View()函数括号里提交ViewBag参数
这种传法属于路由传参数,也就是只有写了viewBag.属性名之后,读取器
访问该页面之后就能在前台通过viewBag.属性名来获取值,但是,这个用法是有缺点的,就是控制器里写的viewBag.属性名只能给自己的视图使用,如果要通过自己控制器调用其他控制器,要想另一个控制器能用viewBag.属性名,是不可以的,除非把viewBag.属性名也传过去,但是viewBag.属性名类型特殊,最好不要用来传递, 就是说最好不要把viewBag.属性名当做实参进行控制器的参数传递,一般viewBag.属性名都是控制器及它的内容页自己用,内容页可以直接通过viewBag.属性名这种形式访问到viewBag,传给自己时把viewBag.属性名写在View的参数中倒是可以。如果不在View的参数中传ViewBag的话,后台只能通过viewBag.属性名的格式来获取ViewBag,用Model获取会获取不到。因为本身路由传递里没有写参数,也就没有传参数到前台,所以Model为null

应用1:
通过ViewBag传参数,传字符串

传字符串不能直接使用.属性名的方式传,只有把字符串写到ViewData[“username”]里,然后传ViewData[“username”]。
这种方法是错误传法,原因是因为它会将字符串当做某种东西:ViewBag.username4 = “sdfsd”;//错误做法

后台return传给前台

//传字符串,前台通过Model接收
ViewData["username"] = "xx";
return View(ViewData["username"]);//正确写法,

前台通过Model接收

@*默认可以不转类型,但是如果转类型一定要和后台传的类型转成一致*@
@model string
@Model @* 后台如果没有用路由传参(ViewBag)的话,Model值为null *@
还可以通过ViewData["username"]这样接收,因为这里传的是ViewData

应用2:
通过ViewBag传对象类型集合

List<UserInfo> myList2 = new List<UserInfo>();
myList2.Add(new UserInfo() { name = "李清照", age = 23, address = "宋" });
myList2.Add(new UserInfo() { name = "黄月英", age = 18, address = "三国" });
myList2.Add(new UserInfo() { name = "黄忠", age = 50, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 27, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 35, address = "三国" });
ViewBag.username5 = myList2;
return View(ViewBag.username5);
//也可以这样return View();写,只不过这样写前台不能使用Model来获取值

前台通过Model取后台使用ViewBag传过来的参数

@*//默认可以不转类型,但是如果转类型一定要和后台传的类型转成一致*@
@model List<UserInfo>
@{
foreach (UserInfo item in Model)
{
    <span>@item.name</span>
    <span>@item.age</span>
    <span>@item.address</span> 
    <br />
    }
}
接收方式2
List<UserInfo> list=ViewBag.username5 as List<UserInfo>



③ 通过Model传对象类型集合.

直接写在return View()括号里即可,前台取值和Viewbag取法一致,但是传字符串也必须和Viewbag的用法一致。基本上和Viewbag用法一致。盲猜是路由传参

应用1:

List<UserInfo> myList2 = new List<UserInfo>();
myList2.Add(new UserInfo() { name = "李清照", age = 23, address = "宋" });
myList2.Add(new UserInfo() { name = "黄月英", age = 18, address = "三国" });
myList2.Add(new UserInfo() { name = "黄忠", age = 50, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 27, address = "三国" });
myList2.Add(new UserInfo() { name = "黄某", age = 35, address = "三国" });
 return View(myList2);//前台和获取ViewBag传的参数一样

前台调用

@*//默认可以不转类型,但是如果转类型一定要和后台传的类型转成一致*@
@model List<UserInfo>
@{
foreach (UserInfo item in Model)
{
    <span>@item.name</span>
    <span>@item.age</span>
    <span>@item.address</span> 
    <br />
    }
}


④ 通过tempdata传参数

应用1:

//通过Model传参数
TempData["username7"] = "tempData";
return View();

前台调用
@TempData["username7"]

posted @ 2022-01-10 18:06  青仙  阅读(425)  评论(0编辑  收藏  举报