======================================================
注:本文源代码点此下载
======================================================
这3个htmlhelper的扩展方法
html.partial:是将视图内容直接生成一个字符串并返回,
html.renderpartial方法是直接输出至当前httpcontext,
而html.renderaction还调用一下action。重新執行一次controller → model → view的順序。
因此它们在视图中的使用方式是不同的:
html.renderpartial("mypartialview");%>
html.renderaction("mypartialview");%>
=html.partial("mypartialview")%> (相当于一个字符串)
注意:renderpartial以renderpartial,renderaction 方法不是返回一个字符串,而是直接输出内容到调用视图模板的输出流中。 方法后使用分号,否则会导致编译器错误。
这是因为代码块是一串代码语句,在c#代码中,需要通过分号标识语句结束。
以下摘自网络:
html.renderpartial与html.renderaction这两个方法都是用来在界面上嵌入用户控件的。
html.renderpartial是直接将用户控件嵌入到界面上:
或
注意:用第一种方法时,用户控件必须放在调用者同一目录下,也可以放在view/shared中。
html.renderaction则通过controller中的action来调用用户控件
controller:----用户控件所在controller
public actionresult usercontrol()
{
return partialview();
}
view:----调用用户控件的view
html.renderaction的方法;這個方法和partial有點不太一樣,他是直接重新執
行一次controller → model → view的順序,然後把產生的頁面帶回到原來的view中再回傳。
所以html.renderaction中傳遞的參數是執行的controller和action名稱。
01
div id="header">
02
h1>
03
a href="/">asp.net mvc music storea>
04
h1>
05
06
ul id="navlist">
07
li class="first">a href="/" id="current">homea>li>
08
li>a href="/store/">storea>li>
09
li>
10
11
li>
12
li>a href="/storemanager/">admina>li>
13
ul>
14
div>
若是想讓建立的action只能讓renderaction呼叫,可以加上childactiononly屬性,讓他無法被直接呼叫。
01
//
02
// get: /store/genremenu
03
04
[childactiononly]
05
public actionresult genremenu()
06
{
07
var genres = storedb.genres.tolist();
08
09
return view(genres);
10
}
以下是執行的比較圖:
基本上renderpartial()與renderaction()這兩個方法非常相似,都是用來將usercontrol(.ascx)嵌入到網頁上,並且可以讓網頁相同功能的區塊重覆使用,不需要在每個頁面重新寫程式碼,不過renderpartial是直接將ascx檔的程式碼嵌入到aspx網頁上,並不會執行對應的action程式碼,例如我們有一個產品的list頁面:
01
"c#" inherits="system.web.mvc.viewpage>" %>
02
03
...
04
05
06
07
編s號m1
08
產£品~名w稱u
09
版c本d?
10
11
12
foreach (var item in model) { %>
13
14
15
"編s輯e", "editproduct", new { id=item.productid}) %> |
16
"詳mo細o", "productdetail", new {id=item.productid })%>
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
若有許多頁面都需要用到此產品清單的列表,可以抽出來變成usercontrol(例如productlist.ascx),方便我們以後重覆利用,不過現在問題來了,那要使用html.renderpartial還是html.renderaction的方法?這時候會建議使用html.renderpartial,因為對於產品清單來說,我們只是用來呈現ienumerable集合內的productmodel資料,並不需要去執行productlist.ascx的action方法,所以就可以在網頁上使用下面的寫法來嵌入此usercontrol:
1
"product", model.products); %>
2
//或是指定usercontrol的路徑
3
"~/views/product/productlist.ascx", model.products); %>
至於html.renderaction則是會去執行controller裡的action,不過renderaction有提供強行別的方式來呼叫action,例如下面種寫法都是相同的:
1
"productlist", "product"); %>
2
//使用強行別的方式來呼叫action
3
(x => x.productlist()); %>
如果在網頁上使用renderaction的方式來嵌入usercontrol,這時候會先去執行productcontroller的productlist方法,再根據回傳的actionresult來決定要呈現哪個ascx檔,當然也可以在html.renderaction傳入ienumerable的集合物件 結論: html.renderpartial適合用在重覆使用的usercontrol,必且只需要透過model來呈現內容,或是對於廣告的usercontrol也適合使用。 html.renderaction則會先去呼叫controller的action方法,如果此usercontrol是需要透過資料庫取得資料來呈現(透過action來讀取資料庫),此時會比較適合使用此方式。
======================================================
在最后,我邀请大家参加新浪APP,就是新浪免费送大家的一个空间,支持PHP+MySql,免费二级域名,免费域名绑定 这个是我邀请的地址,您通过这个链接注册即为我的好友,并获赠云豆500个,价值5元哦!短网址是http://t.cn/SXOiLh我创建的小站每天访客已经达到2000+了,每天挂广告赚50+元哦,呵呵,饭钱不愁了,\(^o^)/