在.net MVC架构中,据目前所知,应该是提倡彻底摒弃原有Web Forms中控件了,这样的话,首先直接带来的好处便是可以大大提高页面加载的速度。
那如果放弃之前便捷的拖拽式UI控件后,首先遇到的便是UI上如何显示内容的问题。
举一个UI上的列表动态加载数据表中数据的例子来说:
如果是Web Form Page页面,步骤通常为在工具栏选取控件,拖拽到页面中,然后在后台Default.aspx.cs页面中实现控件的动态绑定。
1)页面加载后效果如下图所示:
图一
2)页面Default.aspx.cs后台Page_Load事件中添加如下代码:
1 protected void Page_Load(object sender, EventArgs e) 2 3 { 4 5 //页面首次加载 6 7 if(!Page.IsPostBack) 8 9 { 10 11 var activityDs = new DataSet(); 12 13 14 15 using (var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["GTHCConnect"].ToString())) 16 17 { 18 19 sqlConn.Open(); 20 21 var sqlCommandText = " select * from dbo.ActivityCatalogInfo "; 22 23 var da = new SqlDataAdapter(sqlCommandText, sqlConn); 24 25 da.Fill(activityDs); 26 27 } 28 29 30 31 var categoryNameList = (from DataRow row in activityDs.Tables[0].Rows select Convert.ToString(row["NameCHS"])).ToList(); 32 33 BulletedList1.DataSource = categoryNameList; 34 35 BulletedList1.DataBind(); 36 37 } 38 39 }
那对于实现同样动态列表显示功能MVC Web .cshtml静态页面来说,无法使用以上的UI控件。那么要实现以上列表显示的功能就得借助MVC的Razor语法。
1)页面代码如下所示,通过遍历ViewData存储列表内容,实现动态加载页面上列表内容:
1 <ul> 2 3 <li><a id="0" href="javascript:void(0)">优惠活动</a></li> 4 5 <% foreach (DataRow activities in ((DataSet)ViewData["activityDs"]).Tables[0].Rows) 6 7 {%> 8 9 <li><%=Html.ActionLink((string) activities["NameCHS"], new { id = activities["CatalogId"] }.ToString())%> </li> 10 11 <%} 12 13 %> 14 15 </ul>
2)那对于ViewData["activityDs"]的内容的获取,在MVC架构中,则通过Controller来实现,
在HomeController中的Index()方法中,添加如下代码:
1 public ActionResult Index() 2 3 { 4 5 ViewData["Message"] = "欢迎使用 ASP.NET MVC!"; 6 7 var activityDs = new DataSet(); 8 9 10 11 using (var sqlConn = new SqlConnection(ConfigurationManager.ConnectionStrings["GTHCConnect"].ToString())) 12 13 { 14 15 sqlConn.Open(); 16 17 var sqlCommandText = " select * from dbo.ActivityCatalogInfo "; 18 19 var da = new SqlDataAdapter(sqlCommandText, sqlConn); 20 21 da.Fill(activityDs); 22 23 } 24 25 //将Dataset内容填充至ViewData["activityDs"]当中 26 27 ViewData["activityDs"] = activityDs; 28 29 return View(); 30 31 }
3)运行页面,最终得到如下相同效果的动态列表页面
看到这里,难免会有疑问,首先上面的MVC的代码中只看到V(View),C(controller),M在哪里呢,上面的代码只是偷懒的做法,因为MVC毕竟是一种设计架构思想嘛, 如果没有M(model)照样页可以实现相同的功能。只是目前这样就不是典型的MVC架构模式了(典型的MVC代码实现,请参看MVC初探-数据访问及页面显示之二)。
其次,和Web Forms代码相比,实现思想都大同小异嘛,对,在加载内容,两者实现思想区别不大,都是获取数据库中数据,并将其存放至容器中。前者是将其赋予控件的DataSource,后者则是赋予ViewData,区别在于前者是控件自身在页面加载时动态解析DataSource内容,或者这是在页面加载时,动态加载ViewData中存储的内容。
那MVC的好处体现在哪,那对于加载速度,可维护性,可测试性的显而易见的好处就不多说了,至少在本例中,它彻底摒弃了臃肿的UI控件,实现了静态页面中动态显示内容的功能。