Как заполнить список в ASP. NET Entity Framework из базы данных - PullRequest
0 голосов
/ 17 июня 2020

Я пытаюсь создать приложение, в котором я могу управлять клиентами. У всех моих клиентов есть свой клиент, которым я управляю. Итак, я создал базу данных с двумя таблицами tboClienti для моих клиентов и tboSottoClienti для моих «подчиненных клиентов».

Это структура таблиц:

Структура таблицы Clients - tboClienti и структура таблицы Under Clients - tboSottoClienti .

Я работаю над CRUD-операциями для моих «подчиненных клиентов», и я хотел создать раскрывающийся список, в котором я мог бы выбрать своего клиента и вставить информацию (имя, фамилия, компания, телефон) для моего подчиненного клиента .

Вот как я это себе представляю .

Я сделал модель контроллера и просмотрел для моего нижнего клиента, но я не знаю, как сделать список в моем Просмотр страницы Razor.

Это контроллер:

public class SottoClientiController : Controller
{
    private readonly AppDbContext _db;

    public SottoClientiController(AppDbContext db)
    {
        _db = db;
    }

    public IActionResult Index()
    {
        var datiSottoClienti = _db.tboSottoClienti.ToList();
        return View(datiSottoClienti);
    }


    public IActionResult CreareLista()
    {
        ViewData["lstClieti"] = new SelectList(_db.tboClienti, "Id", "Nome_azienda");
        return View();
    }
    public IActionResult CreareSottoCliente()
    {
        return View();
    }

    [HttpPost]
    public async Task<IActionResult> CreareSottoCliente(SottoCliente sottoCliente) 
    {
        if (ModelState.IsValid)
        {
            _db.Add(sottoCliente);
            await _db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(sottoCliente);
    }
}

Это класс модели:

public class SottoCliente
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "Inserisci il nome di proprietario dell'azienda")]
    [Display(Name = "Nome")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "Inserisci il cognome di proprietario dell'azienda")]
    [Display(Name = "Cognome")]
    public string Cognome { get; set; }

    [Display(Name = "Azienda")]
    public string Azienda { get; set; }

    [Required(ErrorMessage = "Inserisci il numero di telefono dell'azienda")]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Telefono")]
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$",
       ErrorMessage = "Numero non valido")]
    public string Cellulare { get; set; }
}

Я не знаю, как получить данные из table tboClienti, чтобы вставить его в список. Таким образом, я могу выбрать клиента для своего нижнего клиента.

И это вид:

<h4>Under Client</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form asp-action="CreareSottoCliente">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>

           <div class="form-group">
            <label asp-for="Azienda" class="control-label"></label>
            <select asp-for="Azienda" class="form-control" asp-items="@ViewBag.lstClieti"></select>
            <span asp-validation-for="Azienda" class="text-danger"></span>
        </div>

            <div class="form-group">
                <label asp-for="Id" class="control-label"></label>
                <input asp-for="Id" class="form-control" />
                <span asp-validation-for="Id" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Nome" class="control-label"></label>
                <input asp-for="Nome" class="form-control" />
                <span asp-validation-for="Nome" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Cognome" class="control-label"></label>
                <input asp-for="Cognome" class="form-control" />
                <span asp-validation-for="Cognome" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Azienda" class="control-label"></label>
                <input asp-for="Azienda" class="form-control" />
                <span asp-validation-for="Azienda" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Cellulare" class="control-label"></label>
                <input asp-for="Cellulare" class="form-control" />
                <span asp-validation-for="Cellulare" class="text-danger"></span>
            </div>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div> 

Я вставляю свою строку подключения в appsettings.json и добавляю ее в ConfigureServices();.

И это класс для контекста базы данных:

 public class AppDbContext: DbContext
 {
        public AppDbContext(DbContextOptions<AppDbContext> options): base (options)
        {
        }

        public DbSet<Tecnico> tboTecnici { get; set; }
        public DbSet<Cliente> tboClienti { get; set; }
        public DbSet<SottoCliente> tboSottoClienti { get; set; }
}

Есть предложения, как получить данные из базы данных и вставить их в список?

Спасибо заранее!

Ответы [ 2 ]

0 голосов
/ 18 июня 2020

Отладьте свой код и убедитесь, что ваше ViewData["lstClieti"] действительно существует.

Убедитесь, что ваше имя представления CreareLista или нет. Если имя представления CreareSottoCliente. Измените, как показано ниже:

//public IActionResult CreareLista()
//{
//    ViewData["lstClieti"] = new SelectList(_db.tboClienti, "Id", "Nome_azienda");
//    return View();
//}
public IActionResult CreareSottoCliente()
{
    ViewData["lstClieti"] = new SelectList(_db.tboClienti, "Id", "Nome_azienda");
    return View();
}

Вся демонстрация:

1. Модель:

public class SottoCliente
{
    [Key]
    public int Id { get; set; }

    [Required(ErrorMessage = "Inserisci il nome di proprietario dell'azienda")]
    [Display(Name = "Nome")]
    public string Nome { get; set; }

    [Required(ErrorMessage = "Inserisci il cognome di proprietario dell'azienda")]
    [Display(Name = "Cognome")]
    public string Cognome { get; set; }

    [Display(Name = "Azienda")]
    public string Azienda { get; set; }

    [Required(ErrorMessage = "Inserisci il numero di telefono dell'azienda")]
    [DataType(DataType.PhoneNumber)]
    [Display(Name = "Telefono")]
    [RegularExpression(@"^\(?([0-9]{3})\)?[-. ]?([0-9]{3})[-. ]?([0-9]{4})$",
       ErrorMessage = "Numero non valido")]
    public string Cellulare { get; set; }
}
public class Cliente
{
    public int Id { get; set; }
    public string Nome_azienda { get; set; }
}

2. Имя просмотра должно быть CreareSottoCliente.cshtml.

3.Контроллер:

public class SottoClientiController : Controller
{
    private readonly MvcProj3_1Context _db;
    public SottoClientiController(MvcProj3_1Context db)
    {
        _db = db;
    }

    public IActionResult Index()
    {
        var datiSottoClienti = _db.tboSottoClienti.ToList();
        return View(datiSottoClienti);
    }
    //SottoClienti/CreareSottoCliente
    public IActionResult CreareSottoCliente()
    {
        ViewData["lstClieti"] = new SelectList(_db.tboClienti, "Id", "Nome_azienda");
        return View();
    }

    [HttpPost]
    public async Task<IActionResult> CreareSottoCliente(SottoCliente sottoCliente)
    {
        if (ModelState.IsValid)
        {
            _db.Add(sottoCliente);
            await _db.SaveChangesAsync();
            return RedirectToAction("Index");
        }

        return View(sottoCliente);
    }
}

4.DbContext:

public class MvcProj3_1Context : DbContext
{
    public MvcProj3_1Context (DbContextOptions<MvcProj3_1Context> options)
        : base(options)
    {
    }       
    public DbSet<Tecnico> tboTecnici { get; set; }
    public DbSet<Cliente> tboClienti { get; set; }
    public DbSet<SottoCliente> tboSottoClienti { get; set; }
}

5.Startup.cs:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllersWithViews();

    services.AddDbContext<MvcProj3_1Context>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("MvcProj3_1Context")));
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHttpsRedirection();
    app.UseStaticFiles();

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapControllerRoute(
            name: "default",
            pattern: "{controller=Home}/{action=Index}/{id?}");
    });
}

6.appSettings. json :

"ConnectionStrings": {
   "MvcProj3_1Context": "Server=(localdb)\\mssqllocaldb;Database=DatabaseName;Trusted_Connection=True;MultipleActiveResultSets=true"
}

Результат: enter image description here

0 голосов
/ 17 июня 2020

В ASP. NET Core MVC ваш код HTML для раскрывающегося списка выглядит так:

 <div class="form-group">
        <label asp-for="NewsTypeId" class="control-label"></label>
        <select asp-for="NewsTypeId" class="form-control" asp-items="@ViewBag.NewsTypeId"></select>
        <span asp-validation-for="NewsTypeId" class="text-danger"></span>
    </div>

и в C# Controller

public IActionResult Create()
{
    ViewData["NewsTypeId"] = new SelectList(_context.TypeOfNews, "TypeId", "TypeName");
    return View();
}

Исходный ответ: { ссылка }

Более подробную пошаговую процедуру можно найти по этой ссылке: https://www.c-sharpcorner.com/article/binding-dropdown-list-with-database-in-asp-net-core-mvc/

...