65.9K
CodeProject 正在变化。 阅读更多。
Home

在 ASP.NET MVC 中使用 DataTable 进行基架

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (7投票s)

2014年10月30日

CPOL

3分钟阅读

viewsIcon

43283

downloadIcon

479

本文演示了使用 DataTable 存储数据的 ASP.NET MVC 基架。

引言

ASP.NET 基架是 ASP.NET MVC 中的一项新功能,借助它,您可以创建基于数据的 Web 应用程序,与数据存储交互并快速轻松地执行添加、删除、编辑和显示操作。

基架自动生成用于列表、显示、添加、删除和编辑数据的默认模板,这些模板稍后可以根据应用程序需求进行自定义。

数据可以存储在各种位置,例如,数据库表、数据表、XML 文件,甚至纯文本文件。 在本文中,我将演示使用数据表的 ASP.NET MVC 基架的工作原理。

背景

一个 MVC 应用程序由以下组件组成

  • 模型:模型是一个类,它表示数据并实现数据处理的逻辑。
  • 视图:视图显示基于模型类的应用程序的用户界面。 使用视图,用户可以添加、删除或编辑数据。
  • 控制器:控制器管理用户输入的数据,并根据数据控制向用户显示哪些视图。

Using the Code

可以通过从“新建项目”对话框中选择“ASP.NET MVC 4 Web 应用程序”模板来创建 ASP.NET MVC 应用程序,如下所示

可以通过从结果对话框中选择空模板来创建一个空项目,如下所示

通过右键单击解决方案资源管理器中的模型文件夹并选择“添加”选项来添加一个名为 Person 的模型类,如下所示

模型数据由以下模型类表示

public class Person
{
    public int Code
    {
        get;
        set;
    }
    public string Name
    {
        get;
        set;
    }
    public int Age
    {
        get;
        set;
    }
}

通过右键单击控制器文件夹并选择“添加”选项来添加一个名为PersonController的控制器,如下所示

从“添加控制器”对话框中,我们在基架选项中选择“带有空的读/写操作的 MVC 控制器”模板,如下所示

控制器类 (PersonController) 中的以下类级别声明创建一个 static datatable 对象来存储模型数据

static DataTable dt = new DataTable();

以下构造函数定义了 datatable 的结构

public PersonController()
{
    if (dt.Columns.Count == 0) // if no columns defined
    {
        dt.Columns.Add(new DataColumn("Code", typeof(int))); // Adding column for the Code attribute
        dt.Columns.Add(new DataColumn("Name", typeof(string))); // Adding column for the Name attribute
        dt.Columns.Add(new DataColumn("Age", typeof(int))); // Adding column for the Age attribute
        DataColumn[] pk = new DataColumn[1];
        pk[0] = dt.Columns[0]; // Specifying Code as the Primary Key
        dt.PrimaryKey = pk;
    }
}

以下 Index() 操作方法用于显示 Person 对象列表

public ActionResult Index()
{
    List<Person> lstPerson = new List<Person>(); // Creating a list of Person objects
    foreach (DataRow dr in dt.Rows)
    {
        Person p = new Person(); // Creating a Person object

	// Setting the column values
        p.Code = Convert.ToInt32(dr[0].ToString());
        p.Name = dr[1].ToString();
        p.Age = Convert.ToInt32(dr[2].ToString());

        lstPerson.Add(p); // Populating the list
    }
    return View(lstPerson); // Returning the data to be displayed by the Index view
}

上面的代码从数据表中读取数据行并填充一个 List 对象。 然后它通过索引视图显示列表。

可以通过右键单击控制器中的操作方法并选择“添加视图”选项,然后从“添加视图”对话框中选择相应的模板来添加视图,如下所示

以下是索引视图的输出

要创建一个新的 Person 对象,使用带有 HttpGet 属性的 Create 方法。 以下 Create() 方法显示创建新 Person 对象所需的用户界面

public ActionResult Create()
{
    return View();
}

上面的代码显示了一个创建视图,如下所示

要保存在创建视图中输入的数据,需要另一个带有 HttpPost 属性的 Create 操作方法,如下所示

[HttpPost]
public ActionResult Create(Person p)
{
    DataRow dr = dt.NewRow(); // Creating a new Data Row

    // Setting values for the columns
    dr[0] = p.Code;
    dr[1] = p.Name;
    dr[2] = p.Age;

    dt.Rows.Add(dr); // Adding Data Row to the Data Table
    return RedirectToAction("Index"); // Displaying the index view
}

上面的代码为数据表创建一个新的数据行,使用在 Person 对象中输入的数据初始化行中的数据,并将该行添加到数据表中。

同样,需要以下两个 Edit 操作,一个带有 HttpGet 属性,另一个带有 HttpPost 属性来编辑 Person 详细信息

public ActionResult Edit(int id)
{
    DataRow dr = dt.Rows.Find(id); // Finding Person in the data table using primary key
    Person p = new Person(); // Creating a new Person object

    // Setting attribute values
    p.Code = Convert.ToInt32(dr[0].ToString());
    p.Name = dr[1].ToString();
    p.Age = Convert.ToInt32(dr[2].ToString());

    return View(p); // Returning data
}

[HttpPost]
public ActionResult Edit(int id, Person p)
{
    DataRow dr = dt.Rows.Find(id); // Finding Person

    // Editing data in data row
    dr[0] = p.Code;
    dr[1] = p.Name;
    dr[2] = p.Age;

    return RedirectToAction("Index"); // Displaying the index view
}

以下是编辑视图

以下两个函数可用于删除 Person 记录

public ActionResult Delete(int id)
{
    DataRow dr = dt.Rows.Find(id);
    Person p = new Person();
    p.Code = Convert.ToInt32(dr[0].ToString());
    p.Name = dr[1].ToString();
    p.Age = Convert.ToInt32(dr[2].ToString());
    return View(p);
}

[HttpPost]
public ActionResult Delete(int id, Person p)
{
    DataRow dr = dt.Rows.Find(id); // Find Person
    dt.Rows.Remove(dr); // Delete data row
    return RedirectToAction("Index");
}

以下是删除视图

可以使用以下 Details 视图显示 Person 记录

public ActionResult Details(int id)
{
    DataRow dr = dt.Rows.Find(id);
    Person p = new Person();
    p.Code = Convert.ToInt32(dr[0].ToString());
    p.Name = dr[1].ToString();
    p.Age = Convert.ToInt32(dr[2].ToString());
    return View(p);
}

上面的代码使用主键搜索 Person 行,并创建一个填充了该行值的 Person 对象。

以下是 Details 视图

RouteConfig.cs 文件中的以下代码用于指定默认的控制器和操作

public static void RegisterRoutes(RouteCollection routes)
{
    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    routes.MapRoute(
        name: "Default",
        url: "{controller}/{action}/{id}",
        defaults: new { controller = "Person", action = "Index", id = UrlParameter.Optional }
    );
}

关注点

我使用 Microsoft Visual Studio Express 2013 for Web 创建了演示项目。

本文是基架如何工作的一个简单演示。 要创建一个更实用和真实的应用程序,您需要将数据存储在数据库中以进行持久存储。

© . All rights reserved.