【问题标题】:Filtering a list based on dropdown value equaling database column value根据等于数据库列值的下拉值过滤列表
【发布时间】:2016-09-27 20:55:24
【问题描述】:

我有一个使用 C# 和 Razor 语法的 MVC 网页,它显示从数据库返回的结果列表,我想使用下拉菜单过滤结果。

基本上我只想显示列值等于下拉菜单值的结果。我唯一的问题是该列是 BIT 数据类型,我无法让它工作。

我尝试将下拉列表的值转换为布尔值,但这也不起作用。我现在不在工作,所以不能发布任何代码抱歉。

我最初查询数据库的方式是使用搜索字符串,基本上将不同的列与搜索字符串进行比较,以及搜索字符串是否为“”或为空。我刚刚将下拉菜单查询添加到此搜索字符串选择查询的末尾,因为它似乎是唯一可以去的地方,它是这样的 -

from db(db.Name.Contains(searchString) && db.InUse.Equals(dropdownValue))
select db

我知道这并不完全正确,但希望您能明白这一点。澄清一下,我遇到的问题是 InUse.Equals,因为 InUse 是 BIT 数据类型,而 dropdownValue 是 INT,转换为 BOOL 时甚至不起作用。我没有收到任何错误并且页面加载,但它实际上并没有过滤结果。

任何帮助都会很棒,我明天会尝试用实际代码更新帖子。

【问题讨论】:

  • 我不知道您是否正在寻找一种 JavaScript 解决方案,以便在您在下拉列表中选择某些内容时简单地隐藏结果,因为您在此处显示 C# 代码。
  • 您是否希望下拉菜单向某些控制器触发 ajax 请求以更新您拥有的此列表?
  • “InUse 是一种 BIT 数据类型”是什么意思? bit datatype in SQL maps to Boolean in the .NET Framework as seen here
  • 我希望下拉列表以与搜索字符串相同的方式工作,基本上查询数据库中的每一行以查看“InUse”列的值是 1 还是 0 . 我不热衷于做 AJAX 请求,因为我也必须更改搜索字符串,不是吗?我没有考虑用 Javascript 以隐藏/显示的方式来做,所以这可能是一个选择。但是,理想情况下,C# 解决方案对我来说是最好的。我的意思是数据库中的“InUse”列是位数据类型,所以要么是 0,1,要么是 null。
  • dropdownValue 将哪些值传递给控制器​​?零和一?您是否尝试过将 dropdownValue 转换为临时布尔变量,然后对该值 db.InUse == tempBoolean 进行直接比较?

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


【解决方案1】:

这是一个非常基本的示例,可用于展示如何根据控制器方法中的值过滤出集合中的元素。

HttpGet 只是返回整个列表,但 HttpPost 会根据表单中的值过滤列表,并将过滤后的列表作为视图的模型返回。

Demo.cshtml

@model List<ServiceCatalog.Models.DemoClass>
@{
    ViewBag.Title = "Demo";
}

<h2>Demo</h2>

<table class="table table-condensed table-hover table-striped table-bordered">
    <thead>
        <tr>
            <th>InUse</th>
            <th>Name</th>
        </tr>
    </thead>
    <tbody>
        @foreach (var m in Model)
        {
        <tr>
            <td>@m.InUse</td>
            <td>@m.Name</td>
        </tr>
        }
    </tbody>
</table>

@using (Html.BeginForm())
{
    <form class="form-horizontal">
        <div class="form-group">
            <label class="col-sm-2" for="Name">Seach String:</label>
            <div class="col-sm-10">
                <input type="text" value="" name="Name" class="form-control" />
            </div>
        </div>
        <div class="form-group">
            <label class="col-sm-2" for="InUse">InUse:</label>
            <div class="col-sm-10">
                <select class="form-control" name="InUse">
                    <option value="true">True</option>
                    <option value="false">False</option>
                </select>
            </div>
        </div>
        <div class="form-group">
            <div class="col-sm-offset-2 col-sm-10">
                <button type="submit" class="btn btn-default">Submit</button>
            </div>
        </div>
    </form>
}

DemoClass.cs

public class DemoClass
{
    public string Name { get; set; }
    public Boolean InUse { get; set; }
}

DemoController.cs

public class DemoController : Controller
{
    [HttpGet]
    public ActionResult Demo()
    {
        var demoList = GetListOfDemoClass().ToList();
        return View(demoList);
    }

    [HttpPost]
    public ActionResult Demo([Bind(Include = "Name,Inuse")]DemoClass demoC)
    {
        var demoList = (from db in GetListOfDemoClass()
                        where (demoC.Name == null || db.Name.Contains(demoC.Name))
                            && db.InUse.Equals(demoC.InUse)
                        select db).ToList();

        return View(demoList);
    }

    private IEnumerable<DemoClass> GetListOfDemoClass()
    {
        yield return new DemoClass() { InUse = false, Name = "Thing 1" };
        yield return new DemoClass() { InUse = true, Name = "Dog 2" };
        yield return new DemoClass() { InUse = false, Name = "Place 3" };
        yield return new DemoClass() { InUse = true, Name = "Raptor 4" };
        yield return new DemoClass() { InUse = false, Name = "Person 5" };
        yield return new DemoClass() { InUse = true, Name = "Hateful 6" };
        yield return new DemoClass() { InUse = false, Name = "Cat 7" };
        yield return new DemoClass() { InUse = true, Name = "Mango 8" };
        yield return new DemoClass() { InUse = false, Name = "Bird 9" };
        yield return new DemoClass() { InUse = true, Name = "Caller 10" };
    }
}

【讨论】:

  • 我发现了我的问题。最后,我实际上并没有从下拉列表中获取值,我不得不将值更改为“True”和“False”并对其进行排序。
猜你喜欢
  • 2013-12-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-26
  • 1970-01-01
  • 2016-12-21
  • 2020-07-01
  • 2017-08-12
  • 2021-05-19
相关资源
最近更新 更多