You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 04:15:56