我们正在使用mvc来创建动态Web表单。表单上的控件之一是下拉列表。为了填充此动态下拉控件,我们将sql语句存储在单个数据库字段中。这是一个很长的故事,为什么我们这样做,但我们遇到的一般问题是如何让我们的下拉列表使用这个sql字段值动态填充。
例如,这是我们数据库中的示例记录。此图像可能太小而无法读取。如果是这样,请尝试右键单击&在新窗口中打开图像(我们使用的字段称为“Sql”):
如您所见,我们有一个名为“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"
},
})
正如您所看到的,目前,我没有使用该字段来填充我的下拉列表。所以我的问题是,我该如何设置呢?
由于
答案 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控件。