MVC:如何从存储在db字段中的sql查询填充dropdownlist

时间:2014-12-29 02:07:47

标签: c# asp.net-mvc kendo-ui

我们正在使用mvc来创建动态Web表单。表单上的控件之一是下拉列表。为了填充此动态下拉控件,我们将sql语句存储在单个数据库字段中。这是一个很长的故事,为什么我们这样做,但我们遇到的一般问题是如何让我们的下拉列表使用这个sql字段值动态填充。

例如,这是我们数据库中的示例记录。此图像可能太小而无法读取。如果是这样,请尝试右键单击&在新窗口中打开图像(我们使用的字段称为“Sql”): enter image description here

如您所见,我们有一个名为“Sql”的字段。在此记录中,我们需要将“product_id”作为下拉列表的id字段& “product_name”作为下拉列表的文本字段。一个已知的,在sql语句中,第一个字段将始终是下拉列表的id。第二个字段将始终是下拉列表的文本。

到目前为止,这是我的下拉列表:

@(Html.Kendo().DropDownList()
      .Name("Filterdropdown")
      .DataTextField("Text")
      .DataValueField("Value")
          .OptionLabel("Select")
                                    //.Events(e => e.Change("change"))
      .BindTo(new List<SelectListItem>() {
          new SelectListItem() {
              Text = "",
              Value = "1"
          },


      })

正如您所看到的,目前,我没有使用该字段来填充我的下拉列表。所以我的问题是,我该如何设置呢?

由于

2 个答案:

答案 0 :(得分:7)

根据您的要求,您必须首先从db获取查询,然后运行它,并使用此查询的结果绑定下拉列表。这是我在同一场景中尝试过的代码。

控制器代码

Entities ent = new Entities();//This is my dbcontext object
//First i will query the db to get the query stored in table
Query query = ent.Queries.FirstOrDefault();
string sql = query.Query;//I have assigned the query to a string and now i will execute this

//Here i run the query in db against the table employee you need to change this to products.
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();        
//Create List of SelectListItem
List<SelectListItem> selectlist = new List<SelectListItem>();
foreach (Employee emp in list)
{
 //Adding every record to list  
 selectlist.Add(new SelectListItem { Text = emp.Name, Value = emp.Id.ToString() });
}

ViewBag.SelectList = selectlist;//Assign list to ViewBag will access this in view
return View(list);

查看代码

@Html.DropDownList("ddlname",(IEnumerable<SelectListItem>)ViewBag.SelectList)

这是我刚刚将ViewBag值分配给下拉列表。我没有使用剑道,但我希望这会帮助你走上正轨。

<强>更新

Instead of hitting sql server twice you can get your required data in just one query.These are two calls to sql server

Query query = ent.Queries.FirstOrDefault();
var list = ent.Employees.SqlQuery(sql).ToList<Employee>();    

这两个可以合并为一个这样的

var list = ent.Employees.SqlQuery(ent.Queries.FirstOrDefault().Query).ToList<Employee>();

答案 1 :(得分:1)

我了解到您正在尝试使用某些数据填充下拉列表。但是,我不确定您在数据库表中保存SQL查询的原因。可能的原因可能是为您的下拉列表提取数据的查询并不总是相同,并且您希望通过DB修改查询的灵活性。虽然这可能不是达到您要求的最好的appraoches,但希望它现在符合您的目的。

现在,根据您为下拉列表提取数据的要求,如果您使用带有SQL的ADO.NET进行查询,则可以通过简单的子查询/函数轻松实现。但是,这里您的应用程序是基于MVC构建的,您可能正在使用Entity框架进行数据访问,这使您只能考虑查询LINQ。

幸运的是,尽管LINQ是通过Entity Framework查询数据库实体的唯一直接方式,但您也可以通过LINQ执行原始SQL查询。所以,你需要做的就是:

步骤1)使用LINQ获取存储在DB中的SQL查询。

sql = DbContextObj.YourQueryTable.ConditionToGetQuery..();

步骤2)在您的数据实体上使用.SqlQuery(sql)方法执行步骤1中获取的查询:

DataForDropDown = DbContextObj.YourDataTable.SqlQuery(sql).ToList..(); 

现在,您可以使用HTML帮助程序生成与数据绑定的Dropdown控件。