【问题标题】:Get list on basis of dropdownlist data in asp.net mvc3根据asp.net mvc3中的下拉列表数据获取列表
【发布时间】:2018-07-13 23:19:58
【问题描述】:

我的模块中有两个下拉列表。

在一个下拉列表中,我硬编码了所有运算符,例如 <,>,<=,>=,==

在第二个下拉列表中,我硬编码了员工的工资,例如1000,2000,3000,4000....50000

现在,如果我从一个列表中选择 < 并从第二个列表中选择 2000 并单击提交按钮,我应该得到工资低于 2000 的员工列表。

我想在 asp.net mvc3 中这样做

我怎样才能完成这项任务?我需要为此编写一个存储过程吗?

我创建了如下下拉列表:

viewModel.OperatorsList = new[]
{
  new SelectListItem { Value = "<", Text = "<" },
  new SelectListItem { Value = ">", Text = ">" },  
  new SelectListItem { Value = "<=", Text = "<=" },
  new SelectListItem { Value = ">=", Text = ">=" },
  new SelectListItem { Value = "==", Text = "==" }
};

viewModel.SalaryList = new[]
{
  new SelectListItem { Value = "1000", Text = "1000" },
  new SelectListItem { Value = "2000", Text = "2000" },  
  new SelectListItem { Value = "3000", Text = "3000" },

  // and so on
};

我已经用它在视图中显示下拉列表:

<%: Html.DropDownListFor(x => x.Operators, Model.OperatorsList)%>

【问题讨论】:

  • 请显示为您的两个下拉列表生成的 html。
  • 顺便说一句,我猜你用的是EF?
  • 这满足你的问题吗?是的,我正在使用实体框架

标签: asp.net-mvc-3 controller operators html-select


【解决方案1】:

好吧,你可以这样做

假设viewModel 是...您的viewModel,并且您有一个具有Salary 属性的实体Employee(此示例中的int,在现实世界中可能是decimal

创建一个静态帮助类

public static class MyHelper
    {
        // a dictionary for your operators and corresponding ExpressionType
        public static Dictionary<string, ExpressionType> ExpressionTypeDictionary = new Dictionary<string, ExpressionType>
        {
            {"<", ExpressionType.LessThan},
            {">", ExpressionType.GreaterThan},
            {">=", ExpressionType.GreaterThanOrEqual}
            //etc
        };
        //a method to filter your queryable
        public static IQueryable<Employee> FilterSalary(this IQueryable<Employee> queryable, int salary, string operatorType)
        {
            //left part of the expression : m
            var parameter = Expression.Parameter(typeof(Employee), "m");
            //body is the right part of the expression : m
            Expression body = parameter;
            //m.Salary
            body = Expression.Property(body, "Salary");
            //m.Salary <= 1000 (for example)
            body = Expression.MakeBinary(ExpressionTypeDictionary[operatorType], body, Expression.Constant(salary));
            //m => m.Salary <=1000
            var lambda = Expression.Lambda<Func<Employee, bool>>(body, new[] { parameter });
            //so it will be queryable.Where(m => m.Salary <= 1000)
            return queryable.Where(lambda);
        }
}

用法

var queryable = context.All<Employee>();//or something like that, returning an IQueryable<Employee>
queryable = queryable.FilterSalary(viewModel.Salary, viewModel.Operators);

【讨论】:

  • Althaus:感谢您的回复。我了解运算符的字典,但对您建议的静态类 FilterSalry 感到困惑。你能帮我解释一下这门课吗?
  • @K2_Ketu 好吧,扩展方法WhereExpression&lt;Func&lt;T, bool&gt;&gt; 作为参数。该方法只是构建此表达式,将其转换为 lambda,并将其传递给 Where 方法。您可能会尝试逐步调试并查看body 中的内容,和/或谷歌搜索表达式树。我也会在我的代码中添加一些注释。
  • @K2_Ketu 和 FilterSalary 不是一个类,只是一个静态扩展方法,比如...Where
  • Althaus:非常感谢。真的很有帮助。现在我明白了。只是多一点帮助。你能告诉我typeof(YourEntity)应该有什么吗? bcoz 你知道员工是我的实体
  • @LeiYang 好吧,Contains 和其他方法(所以不是“比较运算符”)需要一些其他逻辑(您需要反射来获取方法,并使用 Expression.Call)。你可以看看这里:stackoverflow.com/questions/14614645/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
相关资源
最近更新 更多