我是阿瑞,第一次寫技術文章,沒啥經驗,語無倫次的地方還請大家多多體諒。
談談第一個話題:
Asp.net MVC中利用UserControl任意組裝你的View。
在Asp.net MVC中,您可以使用UserControls
來簡化或模組化你的View邏輯。
當然可以像傳統webform中那樣使用。
<uc1:News ID=control1 runat=server listcount="3" />
但是這樣使用,有兩個缺點:
1.aspx頁面頂部必須加個討厭的聲明。對於view來說,當然越簡練越好。
2.還有一個缺點,就是傳遞的參數必須都是基礎資料量類型,如果要傳遞
Object,我們該怎麼辦呢?
好在貼心的asp.net mvc提供了一系列的RenderUserControl方法。
還可以傳遞任何參數,還可以構造初始屬性值,可以不用在aspx頂部進行聲
明。非常乾淨清爽。
<%=Html.RenderUserControl(“~/UserControls/NewsList.ascx”)%>
<%=Html.RenderUserControl
(“~/UserControls/NewsList.ascx”,ViewData.News)%>
第三個參數以匿名方法的形式,可以方便構造出ascx的預設屬性。
<%=Html.RenderUserControl
(“~/UserControls/NewsList.ascx”,ViewData.News, new
{NewID=2})%>
好了,現在usercontrol已經可以很好的切割組裝view層邏輯了,
但是無論如何組裝,都是被動接受controller的調用的。
這有什麼問題嗎?請思考如下情境,也是我之前請教鄒建的問題:
--------------->
有一個情境,不知道如何用mvc實現
比如一個新聞系統,首頁把各個新聞分類裡的新聞標題的最新N條讀出來,
在webform下,我把首頁新聞列表封裝成ascx,並且自訂了兩個屬性:
新聞類別和顯示條數。這種情況下,首頁aspx裡只要有顯示列表的地方,設
置一下這兩個屬性就OK了。也就是說,改首頁aspx,就可以最終只取需要
的資料。
而在mvc下,控製取資料部分和頁面徹底分離,上面的邏輯,既要讓美工去
修改頁面,也要程式員修改controler?
鄒兄給我得回答是言簡意賅 :用RenderComponent。
<-------------------------
這就引入了第二個話題:
web組件的使用,此web組件,不僅僅是像ascx那樣包含view,更重要的是
他有自己的controller行為。而這個組件可以直接被其他的view所調用,
雖然像繞口令,不過結合上面的情境就好理解了。
這個被view層直接調用的controller必須是繼承於ComponentController,
這和普通的controller是不一樣的。類似這樣:
public class NewsComponentController : ComponentController
{
public void ContentList()
{
RenderView("NewsList", new
VstarApp.DAL.Service.ContentInfo_Service().GetAllData());
}
}
而這個 ComponentController所Render的視圖檔案路徑也是有規定的,是
~/Components/yourcontrollerName/Views/ViewName.aspx
對於上面的NewsComponentController來說,就是
~/Components/NewsComponent/Views/NewsList.aspx
所以視圖路徑要建對哦。
剩下的工作,就是在其他view裡調用這個組件controller
<%=Html.RenderComponent<CMSWeb.Controllers.NewsComponentController>(f => f.ContentList())%>
好了,一切ok.