Asp.NetMVC视图(显⽰数据库数据表格)
Asp.Net MVC 视图(显⽰数据库数据表格)
在这篇教程中,我⽰范了显⽰⼀系列数据库记录的两个⽅法。我演⽰了在⼀个HTML表格中格式化⼀系列数据库记录的两个⽅法。⾸先,我演⽰了如何直接在视图中格式化数据库记录。接下来,我⽰范了如何在格式化数据库记录时利⽤部分类。
1.1创建模型类
我们将要显⽰Movies数据库表中的⼀系列记录。Movies数据库表包含下⾯的列:
Column Name Data Type Allow Nulls
Id Int False
Title Nvarchar(200)False
Director NVarchar(50)False
DateReleased DateTime False
为了表⽰Movies数据库表,我们将利⽤Linq to SQL作为我们的数据访问技术。换⾔之,我们将会使⽤LINQ to SQL来绑定我们的MVC模型类。
创建⼀系列LINQ to SQL类的最快办法就是利⽤Visual Studio Object Relational Designer(Visual Studio 对象关系设计器)。右键点击Models⽂件夹,选择“Add(添加)”,“New Item(新建项)”,选择Linq To Sql类模板,将这个类命名为Movie.dbml,并且点击Add按钮(如图1)。
图1:创建LINQ to SQL类
在你创建完Movie Linq to Sql 类以后,会⽴即出现对象关系设计器。你可以将数据库表从服务器浏览器(Server Explorer)窗⼝中拖曳到对象关系设计器中,以便创建代表着特定数据库表的Linq to Sql类。你需要将Movies数据库表添加到对象关系设计器中(如图2)。
图2:使⽤对象关系设计器
默认情况下,对象关系设计器将会试图创建⼀个类名,该类名是数据库表名的单数版本。换⾔之,如果你有⼀个叫做Customers的数据库表,那么对象关系设计器将会创建⼀个叫做Customer的类名。
通常,对象关系设计器⾮常适合完成这件事。不幸的是,对象关系设计器将数据库表名Movies转换为了Movy(很接近,但是错的)。通过在设计器中的类名上点击,并且将类名由Movy改为Movie,你可
以很容易地修正这个问题。
最后,记得点击“Save(保存)”(软盘图标)按钮来保存LINQ to SQL类。否则的话,LINQ to SQL类将不会由对象关系设计器⽣成。
1.2 在控制器动作中使⽤LINQ to SQL
现在我们已经有了LINQ to SQL类,我们可以使⽤这些类从数据库获取数据。代码清单1中的控制器类使⽤LINQ to SQL类获取来⾃Movies数据库表的记录。
代码清单1 – Controllers\HomeController.cs
using System.Linq;
using System.Web.Mvc;
using MvcApplication1.Models;
namespace MvcApplication1.Controllers{
[HandleError]
public class HomeController : Controller {
public ActionResult Index() {
var dataContext = new MovieDataContext();
var movies = from m in dataContext.Movies
select m;
return View(movies);
}
}
}
代码清单1中的Index()动作使⽤LINQ to SQL MovieDataContext类来获取来⾃数据库表中的电影。电影列表被传递给了Index视图,作为ViewData.Model属性的值。
1.3 在视图中进⾏格式化
格式⼀系列数据库记录最简单、但不⼀定是最好的办法,就是直接在视图中执⾏格式化。举个例⼦,代码清单2中的Index视图在⼀个HTML 表格中呈现了movie数据库的记录。
代码清单2 – Views\Home\Index.aspx
<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Home.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="indexContent" ContentPlaceHolderID="MainContent" runat="server">
<table>
<tr>
<th>Id</th><th>Title</th><th>Release Date</th>
</tr>
<% foreach (Movie m in (IEnumerable)ViewData.Model)
{ %>
<tr>
<td><%= m.Id %></td>
<td><%= Html.Encode(m.Title) %></td>
<td><%= m.DateReleased %></td>
</tr>
<% } %>
</table>
</asp:Content>
代码清单2中的视图包含了⼀个foreach循环,该循环遍历了movie记录集中的每⼀个记录。Movie的每⼀个属性值都显⽰在了各⾃的表格单元格中。表格的⾏由HTML <tr>标签创建,表格单元格由HTML <td>标签创建。
注意到Html.Encode()帮助⽅法⽤于在显⽰每个属性值之前对其进⾏编码。任何时候当你接受⽤户输⼊,并且将输⼊重新显⽰在⽹页上时,对输⼊进⾏编码以阻⽌JavaScript注⼊攻击都是很重要的。当你对显⽰HTML内容前对它进⾏编码漠不关⼼时,⿊客便可以做⼀些恶毒且邪恶的事情,例如从你的⽹站⽤户中盗取私⼈数据。
当你运⾏应⽤程序,Index视图会呈现如图3所⽰的页⾯。
图3:使⽤HTML表格格式化了的数据库记录
图3中HTML表格的格式化并不那么令⼈兴奋。我们可以通过创建层叠样式表来改进HTML表格的外观。因为代码清单2中的视图是⼀个content视图,我们必须将层叠样式表添加到与content视图相关联的模板页中。这个模板页位于下⾯路径:
\Views\Shared\Site.master
为了改进HTML表格的外观,我们可以将代码清单3中的样式表添加到模板页<head>的开闭标签之间。
代码清单3 – 层叠样式表
<style type="text/css">
table
{
border-collapse:collapse;
}
table td, table th
{
border: solid 1px black;
padding:10px;
}
</style>
代码清单3中的样式表将单元格之间的边框合并起来,并且添加了⽹格(gridlines)。在你将这个样式表添加到模板页之后,Index视图呈现出图4中的页⾯。
图4:使⽤了样式的HTML表格
1.4 在局部中格式化
除了在视图本⾝中执⾏所有的格式化以外,你可以使⽤局部页⾯(partial)作为⼀个模板来格式化每⼀个数据库记录。举个例⼦,代码清单4中的局部页⾯代表着对于⼀个特定movie数据库记录的格式化。
代码清单4 –\Views\Movies\MovieTemplate.ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MovieTemplate.ascx.cs"
Inherits="MvcApplication1.Views.Movies.MovieTemplate" %>
<tr>
<td> <%=ViewData.Model.Id%></td>
<td> <%=Html.Encode(ViewData.Model.Title)%></td>
<td> <%=ViewData.Model.DateReleased.ToString("D")%></td>
</tr>
代码清单4中的模板将每个movie记录格式化为⼀个HTML表格⾏。模板应⽤到每⼀个数据库记录上。注意到ViewData.Model属性,位于局部页⾯中,代表着单个数据库记录,⽽不是所有的数据库记录集。
网页设计html代码大全继承关系为了将ViewData.Model属性转换为Movie类的实例,你需要为这个局部页⾯创建⼀个代码后置类。代码清单5中的代码后置类指定了MovieTemplate部分类继承⾃⼀个泛型类,该泛型类将Movie作为它的类型参数。
代码清单5 - \Views\Movies\MovieTemplate.ascx.cs
using MvcApplication1.Models;
namespace MvcApplication1.Views.Movies
{
public partial class MovieTemplate : System.Web.Mvc.ViewUserControl<Movie>
{
}
}
MovieTemplate类继承⾃ViewUserControl<movie>类。因为MovieTemplate类继承⾃这个类,ViewData.Model属性⾃动转换为Movie。
代码清单6中的Index视图演⽰了如何在视图中使⽤MovieTemplate部分类。Html.RenderPartial()⽅法⽤于呈现MovieTemplate局部页⾯。
代码清单 6 – \Views\Movies\Index.aspx
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" AutoEventWireup="true" CodeBehind="Index.aspx.cs" Inherits="MvcApplication1.Views.Movies.Index" %>
<%@ Import Namespace="MvcApplication1.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
<table>
<tr>
<th>Id</th><th>Title</th><th>Release Date</th>
</tr>
<% foreach (Movie m in (IEnumerable)ViewData.Model)
{
Html.RenderPartial("MovieTemplate", m);
} %>
</table>
</asp:Content>
在代码清单6中,Html.RenderPartial()⽅法⽤于为每个Movie记录呈现MovieTemplate局部页⾯。两个参数传递给了RenderPartial()⽅法。第⼀个参数是将要呈现的局部页⾯的名称。和视图⼀样,默认情况下,局部页⾯必须位于Views\ControlName ⽂件夹或者是 Views\Shared⽂件夹。
第⼆个参数指定了传递给部分的视图数据。在局部页⾯内部,ViewData.Model属性将会代表⼀个特定的Movie记录。
还有⼀个重要的警告。与⼤多数其他帮助⽅法不同,Html.RenderPartial()⽅法并不会返回⼀个字符串。这意味着你不能像下⾯这样调⽤RenderPatial()⽅法:
<%= Html.RenderPartial("MovieTemplate", m) %>
相反,你应该这样调⽤这个⽅法:
<% Html.RenderPartial("MovieTemplate", m) %>
RenderPartial()⽅法完成了⼀些事情,但它不会表⽰出来。
1.5 ⼩结
这篇教程的⽬的是演⽰如何在⼀个HTML表格中显⽰⼀系列的数据库记录。我们探索了格式化数据库记录的两个⽅法。⾸先,我们直接在⼀个视图中格式化数据库记录。接下来,我们使⽤⼀个局部页⾯作为模板来格式化每⼀个数据库记录。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。