使用查询字符串值通过模型绑定和 Web 窗体筛选数据

作者 Tom FitzMacken

本教程系列演示了将模型绑定与 ASP.NET Web Forms项目配合使用的基本方面。 模型绑定使数据交互比处理数据源对象 ((如 ObjectDataSource 或 SqlDataSource) )更直接。 本系列从介绍性材料开始,在后面的教程中将介绍更高级的概念。

本教程介绍如何在查询字符串中传递值,并使用该值通过模型绑定检索数据。

本教程基于在系列 前面部分创建 的项目。

可以使用 C# 或 VB 下载 完整的项目。 可下载的代码适用于 Visual Studio 2012 或 Visual Studio 2013。 它使用 Visual Studio 2012 模板,该模板与本教程中显示的 Visual Studio 2013 模板略有不同。

生成目标

在本教程中,你将:

  1. 添加新页面以显示学生的已注册课程
  2. 根据查询字符串中的值检索所选学生的已注册课程
  3. 将具有查询字符串值的超链接从网格视图添加到新页面

本教程中的步骤与前面 教程 中的步骤非常相似,用于根据下拉列表中的用户选择筛选显示的学生。 在该教程中,你在 select 方法中使用了 Control 属性来指定参数值来自控件。 在本教程中,将使用 select 方法中的 QueryString 属性来指定参数值来自查询字符串。

添加用于显示学生课程的新页面

添加使用 Site.master 母版页的新 Web 窗体,并将页面命名为 Courses

Courses.aspx 文件中,添加网格视图以显示所选学生的课程。

<asp:Content ID="Content1" ContentPlaceHolderID="MainContent" runat="server">
    <asp:GridView runat="server" ID="coursesGrid"
        ItemType="ContosoUniversityModelBinding.Models.Enrollment"
        SelectMethod="coursesGrid_GetData" AutoGenerateColumns="false">
        <Columns>
            <asp:BoundField HeaderText="Title" DataField="Course.Title" />
            <asp:BoundField HeaderText="Credits" DataField="Course.Credits" />
            <asp:BoundField HeaderText="Grade" DataField="Grade" />
        </Columns>
        <EmptyDataTemplate>
            <asp:Label Text="No Enrolled Courses" runat="server" />
        </EmptyDataTemplate>
    </asp:GridView>
</asp:Content>

定义 select 方法

Courses.aspx.cs 中,将使用在网格视图的 SelectMethod 属性中指定的名称添加 select 方法。 在该方法中,你将定义用于检索学生课程的查询,并指定 参数来自与 参数同名的查询字符串值。

首先,必须添加以下 using 语句。

using ContosoUniversityModelBinding.Models;
using System.Web.ModelBinding;
using System.Data.Entity;

然后,将以下代码添加到 Courses.aspx.cs:

public IQueryable<Enrollment> coursesGrid_GetData([QueryString] int? studentID)
{
    SchoolContext db = new SchoolContext();
    var query = db.Enrollments.Include(e => e.Course)
        .Where(e => e.StudentID == studentID);
    return query;
}

QueryString 属性意味着名为 StudentID 的查询字符串值会自动分配给此方法中的 参数。

在 Students.aspx 上的网格视图中,将添加一个链接到新课程页面的超链接字段。 超链接将包含一个包含学生 ID 的查询字符串值。

在 Students.aspx 中,将以下字段添加到“总学分”字段正下方的网格视图列中。

<asp:TemplateField HeaderText="Total Credits">  
    <ItemTemplate>
        <asp:Label Text="<%# Item.Enrollments.Sum(en => en.Course.Credits) %>" 
            runat="server" />
    </ItemTemplate>
</asp:TemplateField>
<asp:HyperLinkField Text="Courses" DataNavigateUrlFormatString="~/Courses.aspx?StudentID={0}"
    DataNavigateUrlFields="StudentID" />

运行应用程序,请注意网格视图现在包含“课程”链接。

添加超链接

单击其中一个链接时,你将看到该学生的已注册课程。

显示课程

结论

在本教程中,你添加了一个包含查询字符串值的链接。 您在 select 方法中为参数值使用了该查询字符串值。

在下一 教程中,你将将代码从代码隐藏文件移动到业务逻辑层和数据访问层。