根据下拉值等于数据库列值

时间:2016-09-27 20:55:24

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

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

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

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

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

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

我知道这不完全正确,但你希望得到这个想法。只是为了澄清,这是我遇到麻烦的InUse.Equals,因为InUse是一个BIT数据类型,dropdownValue是一个INT,在转换为BOOL时甚至不起作用。我没有错误,页面加载但实际上并没有过滤结果。

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

1 个答案:

答案 0 :(得分:0)

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

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" };
    }
}