javascript - 使用多个下拉列表在单个 View 中过滤具有两个模型的数据表

标签 javascript c# jquery asp.net-mvc

我开始使用 MVC 创建我的项目,使用 MVC 创建不同的项目真的很享受。

所以我刚才创建了当你在单个下拉列表中选择值时过滤数据的数据表

但我仍然对在单个 View 中使用多个下拉列表和两个模型来过滤数据感到好奇

我做了什么......首先,我创建了一个类,我可以用它来使用两个模型显示我的两个数据表

这是我在mvc中的类

 public class MyData
  {
    public IEnumerable<pmTA_ProjectCategory> ProjectCategory { get; set; }
    public IEnumerable<pmTA_FundCategory> FundCategory { get; set; }
  }

创建我的类后,我为两个数据表创建了一个代码,使用一个 View 作为索引,使用一个 View 作为部分 View 来调用两个数据表

这是索引 View 和名为“MyPartialView”的局部 View View 的代码

查看索引:

  @using myProject.Models;
  @model MyData


  <div id="myPartialView">
   @Html.Partial("MyPartialView",Model)
  </div>

  @if (Model.ProjectCategory != null) {
  <table class="table table-bordered table-hover ">
<thead>
    <tr>
        <th>id</th>
        <th>title </th>
        <th>
            description
        </th>

    </tr>
</thead>
<tbody>
    @foreach (var item in Model.ProjectCategory)
    {

        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.id)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.title)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.description)
            </td>

        </tr>
    }
</tbody>
 </table>
}

对于局部 View 的 View

      <table id="myDataTable" class="table table-bordered table-hover ">
      <thead>
        <tr>
            <th>id</th>
            <th>code</th>
            <th>
                title
            </th>
            <th>
                description
            </th>
            <th>--</th>
            <th>--</th>
        </tr>
       </thead>
       <tbody>
        @foreach (var item in Model.FundCategory)

        {
            string selectedRow = "";
            if (item.id == ViewBag.fund)
            {
                selectedRow = "success";
            }
            <tr class="@selectedRow">
                <td>
                    @Html.DisplayFor(modelItem => item.id)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.code)
                </td>
                <td>

                    @Html.DisplayFor(modelItem => item.title)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.description)
                </td>
                <td>
                    @Html.ActionLink("Edit", "FundCategoryEdit", new { id = 
          item.id }, new { @class = "btn btn-primary" })
                </td>
                <td>
                    @Html.ActionLink("Select", "Index", new { 
            fund_category_id = item.id }, null)
                </td>
            </tr>
        }
      </tbody>
       </table>

为了实现我的 View ,我在 Controller 中创建了代码来显示两个数据表,我在 Controller 中声明了我的类的名称

这是我 Controller 中的代码,第一个代码用于部分 View 数据表,第二个代码用于 View 索引

对于部分:

      var viewModel = new MyData();
        viewModel.FundCategory = (from p in db.pmTA_FundCategory

                                  select new
                                  {
                                      id = p.id,
                                      code = p.code,
                                      title = p.title,
                                      description = p.description,
                                      status = p.status
                                  }).ToList()
                  .Select(x => new pmTA_FundCategory()
                  {
                      id = x.id,
                      code = x.code,
                      title = x.title,
                      description = x.description,
                      status = x.status
                  });

查看索引

    if (fund_category_id != null)
        {

            ViewBag.fund = fund_category_id.Value;
            viewModel.ProjectCategory = (from p in db.pmTA_ProjectCategory
                          join g in db.pmTA_FundCategory
                           on p.fund_category_id equals g.id
                          where p.fund_category_id == fund_category_id
                          select new
                          {
                              id = p.id,
                              title = p.title,
                              description = p.description,
                              title1 = g.title,
                              status = p.status
                          }).ToList()
               .Select(x => new pmTA_ProjectCategory()
               {
                   id = x.id,
                   title = x.title,
                   description = x.description,
                   title1 = x.title1,
                   status = x.status

               });

        }

        return View(viewModel);

它们一起在 Index Controller 中,但我将它们分开以便您理解我的代码

if条件的目的是为了显示我的View Index Data表,当点击部分数据表的“Select”按钮时,根据那里的ID,你可以使用上面的代码作为显示另一个数据的引用表使用其他数据表...

为了显示我的多个下拉列表,我总是使用这些代码

显示下拉列表的索引 View 代码

     <div>
     @Html.DropDownList("id", ViewBag.funds as SelectList, "Select...", new 
     { @class = "form-control" })
     </div>
     <div>
     @Html.DropDownList("projectcat", ViewBag.proj as SelectList, 
    "Select...", new 
     { @class = "form-control" })
      </div>

controller中的下拉代码,根据数据库数据显示里面的数据

第一个和第二个下拉列表

     var data1 = from p in db.pmTA_FundCategory

                    select new
                    {
                        id = p.id,
                        code = p.code,
                        title = p.title,
                        description = p.description
                    };

        SelectList list = new SelectList(data1, "id", "title");
         ViewBag.funds = list;

     var data2 = from p in db.pmTA_ProjectCategory

                    select new
                    {
                        id = p.id,
                        title = p.title,
                        description = p.description
                    };

        SelectList list1 = new SelectList(data2, "id", "title");
        ViewBag.proj = list1;

问题是...我如何在不使用任何插件的情况下使用多个下拉列表来过滤我的部分数据表,而是借助 javascript 或任何方法来过滤数据表的数据?

一旦我选择了我的多个下拉列表的值,我的部分数据表将显示与所选的多个下拉列表相对应的数据...

最佳答案

带有多个下拉列表的多表

1) 在你的主视图中添加两个下拉列表

<div class="dropdown">
    @Html.DropDownList("id", (List<SelectListItem>)ViewBag.proj, "--Select id--", new { @onchange = "CallChangefunc1(this.value)" })
</div>

<div class="dropdown">
    @Html.DropDownList("id", (List<SelectListItem>)ViewBag.funds, "--Select id--", new { @onchange = "CallChangefunc2(this.value)" })
</div>

2) 添加两个局部 View ,第一个名称为 _GetProjectCategory.cshtml第二个名字是_GetFundCategory.cshtml

确保

第一个局部 View @model将是 @model IEnumerable<WebApplicationMVC1.Controllers.ProjectCategory> 类型

第二个局部 View @model将是 @model IEnumerable<WebApplicationMVC1.Controllers.FundCategory> 类型

只需在各自的局部 View 中添加您的内容。

确保您的两个局部 View 都包含。

@foreach (var item in Model) { //You table contents }

3) 在你的主视图中调用这两个部分 View

<div id="myPartialView1">
    @{Html.RenderPartial("_GetProjectCategory", Model.ProjectCategories);}
</div>

<div id="myPartialView2">
    @{Html.RenderPartial("_GetFundCategory", Model.FundCategories);}
</div>

4) 然后像这样创建一个 View 模型

public class ProjectFundViewModel
{
    public List<ProjectCategory> ProjectCategories { get; set; }
    public List<FundCategory> FundCategories { get; set; }
}

5) 您的操作方法将是(其示例代码并替换为您的代码)。

public ActionResult Index()
{
    //The below query replace by yours
    var projects = db.ProjectCategories.ToList();

    List<SelectListItem> dropDownItems1 = projects.Select(c => new SelectListItem { Text = c.title, Value = c.id.ToString() }).ToList();
    ViewBag.proj = dropDownItems1;

    //The below query replace by yours
    var funds = db.FundCategories.ToList();

    List<SelectListItem> dropDownItems2 = funds.Select(c => new SelectListItem { Text = c.title, Value = c.id.ToString() }).ToList();
    ViewBag.funds = dropDownItems2;

    ProjectFundViewModel viewModel = new ProjectFundViewModel
    {
        ProjectCategories = projects,
        FundCategories = funds
    };

    return View(viewModel);
}

6) 将 ajax 调用添加到您的主视图,当您更改相应下拉列表中的任何选项时调用

<script>

    function CallChangefunc1(id) {
         $.ajax({
             url: "@Url.Action("GetProjectCategory", "Default")",
             data: { id: id },
            type: "Get",
            dataType: "html",    
             success: function (data) {
                 console.log(data);
                //Whatever result you have got from your controller with html partial view replace with a specific html.
                $("#myPartialView1").html( data ); // HTML DOM replace
            }
        });
    }

    function CallChangefunc2(id) {
         $.ajax({
             url: "@Url.Action("GetFundCategory", "Default")",
             data: { id: id },
            type: "Get",
            dataType: "html",    
             success: function (data) {
                 console.log(data);
                //Whatever result you have got from your controller with html partial view replace with a specific html.
                $("#myPartialView2").html( data ); // HTML DOM replace
            }
        });
    }

</script>

7) 最后,您的 ajax 调用命中了可以呈现相应局部 View 的操作方法。

public PartialViewResult GetProjectCategory(int id)
{
    var projects = db.ProjectCategories.ToList();
    var model = projects.Where(x => x.id == id).ToList();
    return PartialView("_GetProjectCategory", model);
}

public PartialViewResult GetFundCategory(int id)
{
    var funds = db.FundCategories.ToList();
    var model = funds.Where(x => x.id == id).ToList();
    return PartialView("_GetFundCategory", model);
}

8) 确保你的主视图@model@model WebApplicationMVC1.Controllers.ProjectFundViewModel不是IEnumerable .

具有多个下拉列表的单个表格

1) 在您的主视图中添加两个带有 id 的下拉列表

<div class="dropdown">
    @Html.DropDownList("id", (List<SelectListItem>)ViewBag.ids, "--Select id--", new { @onchange = "CallChangefunc1(this.value)", @id = "dropdown1" })
</div>

<div class="dropdown">
    @Html.DropDownList("title", (List<SelectListItem>)ViewBag.titles, "--Select title--", new { @onchange = "CallChangefunc2(this.value)", @id = "dropdown2" })
</div>

2) 添加名称为 GetFilteredData.cshtml 的局部 View 与型号 @model IEnumerable<WebApplicationMVC1.Controllers.ProjectCategory> .

确保您的部分 View 包含。

@foreach (var item in Model) { //You table contents }

3) 在主视图中调用您的局部 View ,例如

<div id="myPartialView">
    @{Html.RenderPartial("GetFilteredData", Model.ProjectCategories);}
</div>

4) 现在您的第一个下拉列表包含 ids第二个下拉包含 titles来自项目类别。

public ActionResult Index()
{
    var projects = db.ProjectCategories.ToList();

    List<SelectListItem> dropDownItems1 = projects.Select(c => new SelectListItem { Text = c.id.ToString(), Value = c.id.ToString() }).ToList();
    ViewBag.ids = dropDownItems1;

    List<SelectListItem> dropDownItems2 = projects.Select(c => new SelectListItem { Text = c.title, Value = c.title }).ToList();
    ViewBag.titles = dropDownItems2;

    ProjectFundViewModel viewModel = new ProjectFundViewModel
    {
        ProjectCategories = projects,
    };

    return View(viewModel);
}

5) 从主视图添加ajax调用

<script>

    function CallChangefunc1(id) {

        var title = $("#dropdown2").val();

         $.ajax({
             url: "@Url.Action("GetFilteredData", "Default2")",
             data: { id: id, title: title },
            type: "Get",
            dataType: "html",
             success: function (data) {
                 console.log(data);
                //Whatever result you have got from your controller with html partial view replace with a specific html.
                 $("#myPartialView").html( data ); // HTML DOM replace
            }
        });
    }

    function CallChangefunc2(title) {

        var id = $("#dropdown1").val();

         $.ajax({
             url: "@Url.Action("GetFilteredData", "Default2")",
             data: { id: id, title: title },
            type: "Get",
            dataType: "html",
             success: function (data) {
                 console.log(data);
                //Whatever result you have got from your controller with html partial view replace with a specific html.
                 $("#myPartialView").html( data ); // HTML DOM replace
            }
        });
    }

</script>

6) 最后,您的 ajax 调用命中了带有 2 个参数的操作方法。

public PartialViewResult GetFilteredData(int? id, string title)
{
    var query = db.ProjectCategories.ToList();

    if (id != null)
        query = query.Where(x => x.id == id).ToList();

    if (!string.IsNullOrEmpty(title))
        query = query.Where(x => x.title == title).ToList();

    return PartialView("GetFilteredData", query);
}

关于javascript - 使用多个下拉列表在单个 View 中过滤具有两个模型的数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52118474/

相关文章:

javascript - 避免多次动态报价 onclick

javascript - 将文本框的父名称和 id 附加到新生成的文本框

javascript - 修复了 DIV 定位问题

c# - 发送比发送缓冲区中可以存储的数据更多的数据

javascript - 不存在 'Access-Control-Allow-Origin' header 。 origin因此不允许访问

javascript - .css() 会自动添加 vendor 前缀吗?

javascript - 大背景图像导致滚动时滞后

c# - 如何从 Sharepoint url 获取所有 SSRS 报告?

c# - Visual Studio 解决方案中使用的 .vs 文件夹是什么?

javascript - 行尾不间断空格