首页 > 解决方案 > 如何在 MVC 中显示带有详细行的表格

问题描述

我正在尝试在 MVC 视图中从 sql 数据库中查看表上的数据。该表应包含(项目)的行和(子项目)的子行首先,我从控制器读取表记录作为 json 并将结果发送到视图中的数据表。项目已出现在表中,但子项目未出现。谁能帮我!

我的控制器代码:

    using Budget_system.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data.SqlClient;
using System.Data;
using Sitecore.FakeDb;
using System.IO;
using Newtonsoft.Json;
using System.Web.Helpers;

namespace Budget_system.Controllers
{
    public class BudgetSystemController : Controller
    {
        private List<ItemsData> Data = new List<ItemsData>();
        private List<ItemsData> Data1 = new List<ItemsData>();

        public object SubItems { get; private set; }

        public ActionResult Items()
        {
             SqlConnection cn = new SqlConnection();
            SqlCommand cmd = new SqlCommand();
            cn.ConnectionString = "Data Source=.;Initial Catalog=Budget System;Integrated Security=SSPI";
            cmd.Connection = cn;
            cmd.Connection.Open();
            cmd.CommandText = "select ID,_Name,_Department,_Type,_OpenAmmount  from Items where _year='" + 2019 + "'";
            SqlDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {

                Data.Add(new ItemsData() { ID = int.Parse(dr[0].ToString()), Name = dr[1].ToString(), Department = dr[2].ToString(), Type = (dr[3].ToString()), ItemOpenAmmount = float.Parse((dr[4].ToString())) });
            }
            return View("Items",Data);
        }
        public ActionResult Create(ItemsData itemsData)
        {


            using (SqlConnection connection = new SqlConnection("data source =.; database = Budget System; integrated security = SSPI; "))
            {
                try
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand("select ID,_Name,_Department,_Type,_OpenAmmount  from Items where YEAR='" + DateTime.Now.Year.ToString() + "' ", connection);
                    int numOfRows = command.ExecuteNonQuery();
                    command = new SqlCommand("SELECT TOP 1 * FROM Items   ORDER BY ID DESC", connection);
                     int ID = (int)command.ExecuteScalar();

                    if (itemsData.SubItems != null)
                    {
                        for (int i = 0; i < itemsData.OpenAmmount.Count; i++)
                        {
                            if (itemsData.OpenAmmount[i].ToString() != "" && itemsData.SubItems[i] != "")
                            {
                                command = new SqlCommand("insert into SubItems values('" + ID + "','" + itemsData.SubItems[i] + "','" + itemsData.OpenAmmount[i].ToString() + "');", connection);
                                command.ExecuteNonQuery();

                            }
                        }

                    }
                }
                catch (Exception ex)
                {
                    ViewData["Error"] = ex.Message;
                }
                finally
                {
                    connection.Close();

                }
            }
            return View("Create");
        }
        public ActionResult collectData(ItemsData itemsData)
        {
            using (SqlConnection connection = new SqlConnection("data source =.; database = Budget System; integrated security = SSPI; ")) 
            {
                try
                {
                    connection.Open();
                    SqlCommand command = new SqlCommand("insert into Items values('" + itemsData.Name + "','" + itemsData.Year + "','" + itemsData.Department + "','" + itemsData.Divistions + "','" + itemsData.Type + "','" + itemsData.ItemOpenAmmount + "') ", connection);
                    command.ExecuteNonQuery();
                    command = new SqlCommand("SELECT TOP 1 * FROM Items   ORDER BY ID DESC", connection);
                    int ID = (int)command.ExecuteScalar();
                    if (itemsData.SubItems!= null)
                    {
                        for (int i=0;i<itemsData.OpenAmmount.Count;i++)
                        {
                            if (itemsData.OpenAmmount[i].ToString() != ""&&itemsData.SubItems[i]!="")
                            {
                                command = new SqlCommand("insert into SubItems values('" + ID + "','"+itemsData.SubItems[i]+"','" + itemsData.OpenAmmount[i].ToString() + "');", connection);
                                command.ExecuteNonQuery();

                            }
                        }

                    }
                }
                catch (Exception ex)
                {
                    ViewData["Error"] = ex.Message;
                }
                finally
                {
                    connection.Close();

                }
            }
            return View("Create");
        }


        public JsonResult GetDetail(int id)
        {
            SqlConnection cn = new SqlConnection();
            SqlCommand cmd = new SqlCommand();
            cn.ConnectionString = "Data Source=.;Initial Catalog=Budget System;Integrated Security=SSPI";
            cmd.Connection = cn;
            cmd.Connection.Open();
            cmd.CommandText = "select _subID,_Name,_OpenAmmount   from SubItems where _subID='" + id + "'";
            SqlDataReader dr = cmd.ExecuteReader();
            while (dr.Read())
            {

                Data1.Add(new ItemsData() { subItemID = int.Parse(dr[0].ToString()), SubItems = ((List<string>)dr[1]), OpenAmmount = (List<float>)dr[2] });
            }
            return Json((from c in Data1
                         where c.ID == id
                     select c.Name).First(), JsonRequestBehavior.AllowGet);

        }


    }
}

我的模型课:

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

namespace Budget_system.Models
{
    public class ItemsData
    {
        public int ID { get; set; }
        public string Name { get; set; }

        public List<string> SubItems { get; set; } 


    public int subItemID { get; set; }
        public string Year { get; set; }
        public string Department { get; set; }
        public string Divistions { get; set; }
        public string Type { get; set; }
        public List<float> OpenAmmount { get; set; }
        public float ItemOpenAmmount { get; set; }

    }
}

我的观点:

@model IEnumerable<Budget_system.Models.ItemsData>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous">
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.7/umd/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1" crossorigin="anonymous"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/js/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM" crossorigin="anonymous"></script>
<script src="~/Scripts/jquery-3.4.1.js"></script>

@{
    ViewBag.Title = "Items";
    Layout = "~/Views/Shared/_LayoutPage1.cshtml";
}
<script>

    var colCount;
    $(document).ready(function () {
        colCount = $(".tbl tr:first").children().length;
        $("tr:odd").css("background-color", "#f0f3f4");
        $(".pm").click(function () {
            if ($(this).hasClass("plus")) {
                $(this).removeClass("plus").addClass("minus");
                if (!$(this).closest("tr").next().hasClass("detail")) {
getDetail($(this).closest("tr"));
                }
                else
                    $(this).closest("tr").next().show();
            }
            else {
                if ($(this).closest("tr").next().hasClass("detail"))
                    $(this).closest("tr").next().hide();
                $(this).removeClass("minus").addClass("plus");
            }
        });
    });
    function getDetail(row) {
        var rowNew = $("<tr class='detail'><td colspan=" + colCount + "></td></tr>");
        $.ajax({
            timeout: 30000,
            data: "id=" + row.find("td:eq(1)").html(),
            url: '@Url.Action("GetDetail")',
            dataType: "json",
            contentType: "application/json; charset=utf-8",
            success: function (result) {
                rowNew.find("td").append("<b>Address </b>: " + result.ID);
                rowNew.find("td").append("<b>Sex </b>: " + result.ID);
                rowNew.find("td").append("<b>Nationality </b>: " + result.ID);
                row.after(rowNew);
            },
            error: function (a, b, c) {
                debugger;
            }
        });
    }
    </script>


    <h2>Index</h2>
    <style>
        .tbl {
            border: 1px solid gray;
        }

            .tbl td {
                padding: 5px 10px 5px 10px;
            }

            .tbl th {
                padding: 5px 10px 5px 10px;
                background-color: Gray;
                color: White
            }

        .pm {
            cursor: pointer;
        }

        .plus {
            background: url('http://www.quimicasuiza.com/images/extras/plus-minus.gif') 0 -16px;
            display: block;
            width: 16px;
            height: 16px;
        }

        .minus {
            background: url('http://www.quimicasuiza.com/images/extras/plus-minus.gif') 0 0;
            display: block;
            width: 16px;
            height: 16px;
        }

        .detail {
            background-color: #d4d0d8;
            padding: 7px;
        }
    </style>
    <table class="tbl" cellpadding="0" cellspacing="0">
        <tr><th>&nbsp;</th><th>Id</th><th>Name</th><th>Department</th></tr>
        @foreach (var row in Model)
        {
            <tr><td><span class="pm plus"></span></td><td>@row.ID</td><td>@row.Name</td><td>@row.Department</td></tr>
        }
    </table>

标签: javascriptc#jqueryasp.net-mvcdatatables

解决方案


推荐阅读