【问题标题】:ASP.NET Razor - How to display data from multiple tables in databaseASP.NET Razor - 如何显示数据库中多个表中的数据
【发布时间】:2019-01-19 07:27:37
【问题描述】:

对不起,如果问题措辞不好,但我很困惑,而且很晚了,但我会尽力解释。所以我试图在不使用实体框架的情况下将数据库中的所有订单显示到一个表中。问题是当我去 orders/getAllOrders 时,我得到一个大错误,上面写着“视图”,然后是一堆

 <tr><td>2</td><td>Javier</td><td>1</td><td>Groovestring</td><td>3.950000</td></tr>etc..

里面有我的数据,但我不知道如何正确显示它。我知道我的查询工作正常,我的数据检索正常,但我很难显示它

这是我目前拥有的控制器。

namespace Website.Controllers
{
public class OrderController : Controller
{

    private static bool CanConnectToDb()
    {
        var cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        try
        {
            cnn.Open();
            return true;
        }
        catch (Exception exception)
        {
            return false;
        }
        finally
        {
            if (cnn.State != ConnectionState.Closed)
                cnn.Close();
        }
    }


    public ActionResult getAllOrders()
    {
        // Connect to Database
        var cnn = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
        cnn.Open();
        // Create Command
        SqlCommand cmd = new SqlCommand(
            @"SELECT CustomerOrderId, FirstName ,ProductId, [Name], Price
                FROM OrderProduct AS o
                INNER JOIN CustomerOrder co ON co.id = o.CustomerOrderId
                INNER JOIN Product p ON p.Id = o.ProductId
                INNER JOIN Customer c ON c.Id = co.CustomerId
                ORDER BY ProductId"
            );

        cmd.Connection = cnn;
        string store = "";
        // Read from Database
        SqlDataReader reader = cmd.ExecuteReader();

        var orders = new OrderIndexViewModel();
        while (reader.Read())
        {
            orders.CustomerOrderId = reader.GetInt32(0);
            orders.FirstName = reader.GetString(1);
            orders.ProductId = reader.GetInt32(2);
            orders.Name = reader.GetString(3);
            orders.Price = reader.GetDecimal(4);
            store += "<tr><td>" + orders.CustomerOrderId + "</td><td>" + orders.FirstName + "</td><td>" + orders.ProductId + "</td><td>" + orders.Name + "</td><td>" + orders.Price + "</td></tr>";
        }
        cnn.Close();
        return View(store);
    }
  }
}

编辑:当我将返回更改为

rerturn View(orders);

我收到此错误

The model item passed into the dictionary is of type 'Website.Models.OrderIndexViewModel', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[Website.Models.OrderIndexViewModel]'.

这是我的模特

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace Website.Models
{
    public class OrderIndexViewModel
    {
        public int CustomerOrderId { get; set; }
        public string FirstName { get; set; }
        public int ProductId { get; set; }
        public string Name { get; set; }
        public decimal Price { get; set; }
    }
}

最后这是我的观点

@model IEnumerable<Website.Models.OrderIndexViewModel>  
@{
    ViewBag.Title = "getAllOrders";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>getAllOrders</h2>

<p>
    @Html.ActionLink("Create New", "Create")
</p>
<table class="table">
    <tr>
        <th>
            Customer Oder Id
        </th>
        <th>
            First Name
        </th>
        <th>
            ProductId
        </th>
        <th>
            Name
        </th>
        <th>
            Price
        </th>
    </tr>
    @foreach (var item in Model)
    {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.CustomerOrderId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.ProductId)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Name)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.Price)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Details", "Details", new { /* id=item.PrimaryKey */ }) |
                @Html.ActionLink("Delete", "Delete", new { /* id=item.PrimaryKey */ })
            </td>
        </tr>
    }
</table>

任何帮助将不胜感激

【问题讨论】:

  • 你的方法返回一个string - 你需要返回一个OrderIndexViewModel 的集合

标签: c# asp.net sql-server asp.net-mvc razor


【解决方案1】:

您将字符串发送到模型,但您必须将集合发送到模型然后显示在表格中

【讨论】:

    【解决方案2】:

    您的视图期望 IEnumerable&lt;Website.Models.OrderIndexViewModel&gt; 作为模型,但您传递给它的是 Website.Models.OrderIndexViewModel 的单个实例。

    这可能是您代码中的另一个错误,因为它只会呈现 select 语句中的最后一项。所以你会想要这样的东西,它会为每个结果呈现一行:

    var orders = new List<OrderIndexViewModel>();
        while (reader.Read())
        {
            var order = new OrderIndexViewModel();
            order.CustomerOrderId = reader.GetInt32(0);
            order.FirstName = reader.GetString(1);
            order.ProductId = reader.GetInt32(2);
            order.Name = reader.GetString(3);
            order.Price = reader.GetDecimal(4);
            orders.Add(order);
        }
        cnn.Close();
        return View(orders);
    

    【讨论】:

    • 非常感谢我在这方面工作了这么久
    猜你喜欢
    • 2020-01-02
    • 2014-11-22
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2021-10-02
    • 2021-09-30
    相关资源
    最近更新 更多