我是阿瑞,第一次写技术文章,没啥经验,语无伦次的地方还请大家多多体谅。
谈谈第一个话题: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.