【问题标题】:Using multiple checkboxes for same property to filter data in MVC .NET对同一属性使用多个复选框来过滤 MVC .NET 中的数据
【发布时间】:2014-12-03 00:19:18
【问题描述】:

我正在关注http://www.asp.net/mvc/overview/getting-started/introduction/getting-started 的 ASP.NET MVC 5 教程

本教程创建一个包含电影对象的基本数据库,其属性为标题、发行日期、流派和价格。

我有两个复选框,一个用于价格为 5 的电影,一个用于 10。

如果仅选中一个复选框,我的工作正常,但如果同时选中两个复选框(我试图列出价格为 5 的电影和价格为 10 的电影),则视图中不会显示任何内容。

我走远了吗?

型号:

 public class Movie
 {
    public int ID { get; set; }
    public string Title { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string Genre { get; set; }
    public decimal Price { get; set; }

 }

public class MovieDBContext : DbContext
{
    public DbSet<Movie> Movies { get; set; }
}

控制器:

 public class MoviesController : Controller
{
    private MovieDBContext db = new MovieDBContext();



    public ActionResult Index(bool movieCost5 = false, bool movieCost10 = false)
    {

        var movies = from m in db.Movies
                     select m;



        if (movieCost5 == true && movieCost10 == false)
        {
            movies = movies.Where(x => x.Price == 5);
        }
        else if (movieCost5 == true && movieCost10 == true)
        {
            movies = movies.Where(x => x.Price == 5 && x.Price == 10);
        }

        else if (movieCost5 == false && movieCost10 == true)
        {
            movies = movies.Where(x => x.Price == 10);
        }

        return View(movies);
    }
}

【问题讨论】:

  • 除了下面的答案之外,您还应该将您的 movies 变量转换为 IQueryable&lt;Movie&gt; 以延迟数据库调用的执行,直到您评估了您的过滤器。就像现在一样,代码是说“获取数据库中的每一部电影并将其存储在内存中”,然后是“从符合标准 X 的内存对象中获取每一部电影”。这在较小的数据集上不会很明显,但随着它们变大,您会注意到您的代码拖了。
  • 谢谢,我会试一试的。

标签: c# asp.net-mvc checkbox


【解决方案1】:
x.Price == 5 && x.Price == 10

这意味着您正在同时寻找价格为 5 和 10 的电影 - 除非您有一些自定义逻辑来将您的 Price 与整数进行比较,否则这将永远无法工作。

您可能正在寻找:

x.Price == 5 || x.Price == 10

(逻辑或不是逻辑与)

编辑:

在处理类似问题时,尝试缩小问题范围通常很有用,您可以自己完成这项工作。如果您认为您的复选框逻辑的工作方式存在问题,为什么不在更简单的情况下对其进行测试,例如:

if (movieCost5 == true && movieCost10 == false)
{
   movies = new[] { new Movie { Title = "movieCost5 works correctly" } };
}
else if (movieCost5 == true && movieCost10 == true)
{
   movies = new[] { new Movie { Title = "YAY! Both work as well!" } };
}
else if (movieCost5 == false && movieCost10 == true)
{
   movies = new[] { new Movie { Title = "movieCost10 works correctly" } };
}

【讨论】:

  • 谢谢,在对两个或三个属性进行排序时工作。有没有更好的方法来做到这一点,比如我是否对众多属性进行排序?即使我缺乏经验,我也忍不住想有更好的方法。
  • 使用 Linq to SQL 进行多种排序的一种方法是对可查询对象进行默认排序,即使它只是数据库 ID:movies = db.Movies.OrderBy(x =&gt; x.Id).AsQueryable()。然后,您可以以类似于您所拥有的价格的方式向其添加更多种类,但您可以添加 .ThenBy(),而不是 .Where()。现在,这些应用的顺序很重要,因此如果您希望用户按照他们选择的顺序应用排序,它会变得更加复杂。这将占用比 cmets 允许的更多空间。
猜你喜欢
  • 2014-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-23
  • 2016-05-11
  • 1970-01-01
  • 2016-07-13
相关资源
最近更新 更多