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"]