MVC传值汇总
?方法一:
Url傳參是通過Get的方式,一般我們都是通過一定規則的Url來傳參。比如下面的URL。
http://localhost/contorller/action/?Params1=a&Params2=b
public ActionResult Index(ExpModel model, string Params1 , string Params2)
{
??????????? ViewBag.P1 = Params1 ;
??????????? ViewBag.P2= Params2;
??????????? return View();
}
方法二:
修改MVC3中的路由規則
在Global.asax.cs中,修改路由規則
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
?????????"Default", // 路由名稱
?????????"{controller}/{action}/{id}", // 帶有參數的 URL
???????? new { controller = "Home", action = "Index", id = UrlParameter.Optional} // 參數默認值
);
MapRoute方法在RouteCollectionExtensions里有6個重載版本,有興趣的可以研究這里里面的方法,這里我抽其中的一個進行
public static Route MapRoute( ???
this RouteCollection routes, ???
string name, ???
string url, ???
Object defaults, ???
Object constraints, ???
string[] namespaces )
name:路由在路由列表里的唯一名字(兩次MapRoute時name不能重復)
url:路由匹配的url格式
defaults:路由url {占位符} 的默認值
constraints:url的 {占位符} 的約束
namespaces:這個是用于設置路由搜索的控制器命名空間
比如,我們可以修改為下面的規則
?routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
????????? "Default", // 路由名稱
??????????"{controller}/{action}/{uid}_{token}_{others}.html", // 帶有參數的 URL
????????? new { controller = "Home", action = "Index", uid = UrlParameter.Optional, token = UrlParameter.Optional,others = UrlParameter.Optional} // 參數默認值
);
如果訪問的URL地址如:http://localhost/home/index/123_tokenvalue_othersvalue.html 時
controller="Home", action="Index", uid=123, token=tokenvalue, others=othersvalue
獲取和上面的方法一樣。
OK,以上是抄別人的,來源我也忘了,百度吧,以下來點猛的
上面的方式無非是URL的問題,而本質我們可以區分為GET/POST,但看這兩種先,用的做多的
區分Get和Post
1、Get方法是用來向服務器上獲取數據,而Post是用來向服務器上傳遞修改數據。
2、Get將表單里的數據添加到action所指向的URL后面,并且兩者之間使用”?”連接,而各個變量之間使用”&”連接;Post是將表單中的數據放在form的數據體中,按照變量和值對象的方式,傳遞到所指向的action.
3、Get是不安全的,因為在傳輸過程中,數據被放在請求的Url中,這樣,用戶可以直接在瀏覽器上看到提交的數據,一些系統內部信息也一同顯示在用戶面前。Post的所有操作對用戶來說都是不可見的。
4、Get傳輸的數據量小,主要是受限與于Url長度限制,其中IE瀏覽器對URL的最大限度為2083個字符。而post可以的傳輸大量的數據,所以在上傳文件和大數據量時使用post。
5、Form提交默認為Get方法提交(好吧,WebForm時代絕對是POST,MVC反轉了)。
6、Get方式獲取數據后,刷新不會有負面的影響,因為它只是獲取數據,而Post方法刷洗頁面重復提交可能會產生不良的后果。
具體使用如下代碼:
Home/Index.cshtml:
<form action="/Home/Search" method="get">
<input? type="text" name="query"/>
<br />
<input? type="submit" value="Seach"/>
</form>
Home/Search方法:
public ActionResult Search(string query)
?
Home/ Search.cshtml頁面用于展示查詢到的信息,代碼略。
運行效果圖如下:
(這個是效果圖)http://localhost:2246/Home/Search?query=哈哈哈
我們可以看到form的參數是直接顯示到url后面的。
而如果使用post方法,如:
<form action="/Home/Search" method="post">
<input type="text" name="query"/>
<br />
<input type="submit" value="Seach"/>
</form>
運行效果圖:
(這個是效果圖)http://localhost:2246/Home/Search
這里form表單數據是沒有體現在url參數上面的。而此時我們刷新頁面,會看到:
(這個是效果圖)"你所查找的網頁要使用已輸入的信息,返回此頁可能需要重復進行的所有操作。。是否要繼續操作?”"
如果是向數據庫里提交數據,刷新頁面極有可能就同時提交了兩次相同的數據了。
再次說明,以上這個也是抄的,不過內容我精簡了。以上的方式無非是POST或GET,Controller的寫法一樣,方法暴露參數。
再來看猛料:
MVC中的頁面傳值,通常指Controller和view之間的數據傳遞,經常用到的有幾種方式,總結如下:
一、Controller----------->View
1、ViewData
獲取或設置一個字典,其中包含在控制器和視圖之間傳遞的數據。使用ViewData是采用鍵值對的形式,對所定義的數據進行傳遞。在View中會自動識別到擁有唯一鍵值的ViewData,并將數據顯示出來。
例子:
?public ActionResult() { ???????????
List<Models.BlogArticle> list = (from d in db.BlogArticles where d.AIsDel == false select d).ToList(); ???????????
//2將集合數據傳給視圖 ???????????
// ViewBag.DataList = list;
//viewBag形式 ???????????
//利用viewdata形式 ???????????
ViewData["DataList"] = list; ? ???????????
return View();
}??
視圖中接收:
??<table id="tbList"> ???????
<tr> ???????????
<th>id</th> ???????????
<th>標題</th> ???????????
<th>分類</th> ???????????
<th>狀態</th> ???????????
<th>時間</th> ???????????
<th>操作</th> ???????
</tr> ? ? ???????
<!--遍歷Action方法,設置給ViewData的集合數據,生成html代碼--> ???????
@foreach (BlogArticle a in ViewData["DataList"] as List<BlogArticle>) ???????
{ ???????????
<tr> ???????????????
<td>@a.AId </td> ???????????????
<td>@a.ATitle </td> ???????????????
<td>@a.ACate</td> ???????????????
<td>@a.AStatu </td> ???????????????
<td>@a.AUpdatetime </td> ???????????????
<td>@a.AContent </td> ???????????????
<td> ???????????????????
<a href="javascript:del(@a.AId)">刪</a> ???????????????????
<a href="/home/modify/@a.AId">改</a> ???????????????
</td> ????????????
</tr> ? ???????
} ???
</table>??
2、ViewBag
獲取視圖包,允許自定義屬性進行賦值,屬于動態類型(dynamic),以ViewBag.屬性=屬性值得方式進行傳值,其實這里跟ViewData的使用原理類似。
例子:
public ActionResult Index() { ????????
ViewBag.Title="Hello!";
}??
視圖中接收 <h1>ViewBag.Title</h1>
3、其他方式
在從controller向view傳值時,除了以上兩種方式外,還包括一些鏈接的方式,例如頁面跳轉的方式RedirectToAction,還有RenderAction等自動接收等方式。
二、從View-------->Controller
1、其實在這種情況下,通常會選擇利用ajax來通過get或者post進行提交。如果采用最原始的JS來做,就要用到之前總結的ajax經典的五步工作法了,但是通常我們采用JQuery封裝好的ajax提交方式。
即$.ajax({type,url,data,success:function(){})其中最常用的就是這幾個參數屬性了。
2、通過Get方式+路由配置+id值進行提交數據
?<td> ???????????????????
<a href="javascript:del(@a.AId)">刪</a>
?</td>??
JS:
<script type="text/javascript"> ??????
function del(id) { ??????????
if (confirm("您確定要刪除嗎?親~~")) { ??????????????
window.location = "/home/del/" + id;//通過get方式采用路由配置+id的形式 ??????????
} ??????
} ???
?</script>??
三、Action---------->Action
前面兩種傳值方式都是在view和Controller之間進行數據傳遞,那么如果某一個業務需要用到后臺的兩個Action,并且需要再這兩個Action之間進行數據傳遞,這時需要用到另一個概念TempData:獲取要傳遞到視圖的臨時數據.使用時,需要注意TempData的生命周期,只在第一次請求Action時臨時數據存在,之后自動變為NULL,具體的使用與ViewData相同,屬于鍵值對的數據字典類。
public ActionResult Index() ??? { ???????
this.TempData["str"]="wyy"; ???????
return View(); ???
} ???
public ActionResult Index2() ??? { ???????
string name=this.TempData["str"]; ???????
return Content(name); ???
}??
以上是在學習和實踐MVC過程中經常用到的頁面傳值的幾種方式,大的方向看來從C向V數據傳遞以ViewData為基礎,擴展到ViewBag,更加方便快速了。
從V到C傳遞,則歸于ajax中的get和post的提交了。
?
?
轉載于:https://www.cnblogs.com/EasonJim/p/4843148.html
總結
- 上一篇: Swift - 类型属性(类静态属性)和
- 下一篇: (转载)C++之tinyXML使用