如何在ASP.NET Web应用中使用ADO.NET显示内连接查询结果?
解决方案步骤
1. 创建视图模型类
先定义对应查询结果和页面数据的模型,用来承载数据并传递到视图:
// 单个购物车项的模型 public class ShoppingCartItemViewModel { public string Menu { get; set; } public decimal Price { get; set; } public int SelectedAmount { get; set; } // 自动计算小计 public decimal Subtotal => Price * SelectedAmount; } // 整个页面的视图模型 public class OrderViewModel { public CustomerViewModel Customer { get; set; } public DateTime OrderDate { get; set; } public List<ShoppingCartItemViewModel> CartItems { get; set; } } // 客户信息模型 public class CustomerViewModel { public string FirstName { get; set; } public string LastName { get; set; } }
2. 修改数据访问层方法
把原来的void方法改成返回数据列表,通过SqlDataReader读取并映射到模型:
public List<ShoppingCartItemViewModel> GetShoppingCartItems() { var cartItems = new List<ShoppingCartItemViewModel>(); // 格式化SQL语句提高可读性 string queryString = @" SELECT Product.name, Product.price, ShoppingCart.Count FROM Product INNER JOIN ShoppingCart On Product.ID = ShoppingCart.ProductId"; using (SqlConnection con = new SqlConnection(_connectionString)) using (SqlCommand readCommand = new SqlCommand(queryString, con)) { con.Open(); // 用using包裹SqlDataReader自动释放资源 using (SqlDataReader reader = readCommand.ExecuteReader()) { while (reader.Read()) { var item = new ShoppingCartItemViewModel { Menu = reader.GetString(reader.GetOrdinal("name")), Price = reader.GetDecimal(reader.GetOrdinal("price")), SelectedAmount = reader.GetInt32(reader.GetOrdinal("Count")) }; cartItems.Add(item); } } } return cartItems; }
3. 更新控制器逻辑
获取购物车数据,整合到页面视图模型中传给视图:
public IActionResult Index() { var viewModel = new OrderViewModel { Customer = new CustomerViewModel(), OrderDate = DateTime.Now, CartItems = dataacc.GetShoppingCartItems() }; return View(viewModel); }
4. 修改视图渲染数据
指定视图模型类型,遍历购物车数据渲染表格行,同时修正表单验证的错误绑定:
@model OrderViewModel @{ ViewData["Title"] = "Index"; } <h1>Order information</h1> <hr /> <div class="row"> <div class="col-md-2"> <form asp-action="Index"> <div asp-validation-summary="ModelOnly" class="text-danger"></div> <div class="form-group"> <label asp-for="Customer.FirstName" class="control-label"></label> <input asp-for="Customer.FirstName" class="form-control" /> <span asp-validation-for="Customer.FirstName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="Customer.LastName" class="control-label"></label> <input asp-for="Customer.LastName" class="form-control" /> <span asp-validation-for="Customer.LastName" class="text-danger"></span> </div> <div class="form-group"> <label asp-for="OrderDate" class="control-label"></label> <input asp-for="OrderDate" class="form-control" /> <span asp-validation-for="OrderDate" class="text-danger"></span> </div> <div class="form-group mt-2"> <button type="submit" class="btn btn-primary">Save Order</button> </div> </form> </div> <div class="col-md-8"> <table class="table table-bordered"> <thead> <tr> <th>Selected Amount</th> <th>Menu</th> <th>Price</th> <th>Subtotal</th> </tr> </thead> <tbody> @foreach (var item in Model.CartItems) { <tr> <td>@item.SelectedAmount</td> <td>@item.Menu</td> <td>@item.Price.ToString("C")</td> <td>@item.Subtotal.ToString("C")</td> </tr> } </tbody> </table> </div> </div>
关键说明
- 原
showTable方法是void类型,无法返回查询结果,必须改成返回具体模型的列表 - 使用
SqlDataReader.Read()循环读取每一行数据,手动映射到视图模型属性 - 页面视图模型整合了订单的所有数据(客户信息、订单日期、购物车项),更符合MVC的分层设计
- 视图通过
@model指定模型类型,用foreach循环渲染表格数据
内容的提问来源于stack exchange,提问作者Jamiethered2000
相关产品推荐
相关产品推荐

