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"]);
}
頁面之間路由傳引數
傳遞實體物件
傳遞匿名物件(臨時使用)