我正在使用ASP.NET Core和Razor页面。我已经使用ADO.NET模型从存储过程中获取数据。我不确定如何将结果数据传递给下拉列表。我正在根据https://www.learnentityframeworkcore.com/raw-sql#database.executesqlcommand中提供的教程进行尝试,最后一部分是通过Context.Database属性来利用ADO.NET。
如何将包含“ Desc”列的存储过程的结果传递到下拉菜单。
下面是使用的代码
//index.cshtml
<select class="form-control" required multiple id="selLOB" asp-for="SelectedLOBs" asp-items="Model.LOBOptions"></select>
//index.cshtml.cs
public class IndexModel : PageModel
{
private readonly MyDbContext _dbContext;
public IndexModel(MyDbContext dbContext)
{
_dbContext = dbContext;
}
public List<LOB> lOBs { get; set; } = new List<LOB>();
[BindProperty]
public string[] SelectedLOBs { get; set; }
public SelectList LOBOptions { get; set; }
public async Task OnGetAsync()
{
using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
await _dbContext.Database.ExecuteSqlCommandAsync("EXECUTE sp");
}
}
}
// Model
public class LOB
{
public string Desc { get; set; }
}
// Data
public class MyDbContext : DbContext
{
public MyDbContext(DbContextOptions<MyDbContext> options) : base(options)
{
}
}
//startup.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
ConnectionString = Configuration["TestConnectionString:DatabaseConnection"]; // Get Connection String from Appsetting.json
services.AddDbContext<MyDbContext>(options =>
options.UseSqlServer (ConnectionString));
}
尝试了以下新代码:
using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "sp";
_dbContext.Database.OpenConnection();
using (var result = command.ExecuteReader())
{
if (result.Read())
{
LOBOptions = new SelectList(result, "Desc");
}
}
}
但由于InvalidOperationException而出错:关闭阅读器时,无效尝试调用FieldCount
尝试以下代码:
public async Task OnGetAsync()
{
using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
{
command.CommandType = System.Data.CommandType.StoredProcedure;
command.CommandText = "sp";
_dbContext.Database.OpenConnection();
using (var result = command.ExecuteReader())
{
LOB lob = new LOB();
lob.Desc = Convert.ToString(result["Desc"]);
lOBs.Add(lob);
LOBOptions = new SelectList(lOBs, "Desc", "Desc");
}
}
}
并出现
错误lob.Desc = Convert.ToString(result["Desc"]);
答案 0 :(得分:1)
要在视图中填充下拉列表,需要将类型SelectList
的对象从服务器传递到视图。这可以通过ViewBag视图传递,也可以作为模型的一部分传递。
可以通过从数据库中填充数据来创建SelectList
对象。那就是你想做的。
您只是在遵循注释中建议的答案,同时还需要在MSDN上阅读有关此内容的信息。您还需要阅读有关ADO.NET的信息。
不过,以下是我建议用数据库中的数据填充下拉列表的方法。
以下是我的存储过程的代码。
CREATE PROCEDURE GetProductCategories
AS
BEGIN
SELECT CategoryId, CategoryName FROM ProductCategory
END
GO
以下是我的模型课。
public class ProductModel
{
public int Id { get; set; }
public string Name { get; set; }
public int CategoryId { get; set; }
public SelectList Categories { get; set; }
}
以下是我如何从C#代码执行存储过程并在控制器类中填充Categories selectList的方法。
var connectionString = "connectionString";
var productModel = new ProductModel();
List<SelectListItem> listItems = new List<SelectListItem>();
using (var connection = new SqlConnection(connectionString))
{
using (var command = connection.CreateCommand())
{
command.CommandText = "GetProductCategories";
command.CommandType = CommandType.StoredProcedure;
connection.Open();
var dataReader = command.ExecuteReader();
while (dataReader.Read())
{
var item = new SelectListItem();
item.Text = dataReader["CategoryName"].ToString();
item.Value = dataReader["CategoryId"].ToString();
listItems.Add(item);
}
}
}
productModel.Categories = new SelectList(listItems);