ASP.NET CORE:将存储过程的结果传递给下拉列表

时间:2019-03-12 05:12:58

标签: asp.net-core razor-pages

我正在使用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"]);

1 个答案:

答案 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);