1. 程式人生 > 其它 >MVC後臺向前臺傳參

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