. Net Core 3.1 Раскрывающийся список для отображения существующих данных - PullRequest
1 голос
/ 26 апреля 2020

Как вы поймете, я относительный новичок в веб-программировании - переходя от веб-форм (ASPX), написанных на VB. Мой начальный проект разрабатывается в Visual Studio Code (последняя версия) в виде страниц Razor с использованием. Net Core 3.1, как я понял, теперь это самый простой способ. (Я избежал полной версии Visual Studio, поскольку это небольшой проект, я не могу попросить свою организацию заплатить за него, и Microsoft ясно, что версия Community не предназначена для использования в «Предприятиях», поскольку она определяет нас. Я закодировал в Basi c, Pascal и Perl, но я не инстинктивный программист. Мне кажется, что сложность веб-приложения возросла в десять раз с тех пор, как "Classi c ASP", и теперь требуется разделять элементы на View, Model и ViewModel.

Следуя примерам в Интернете, я ' у меня есть приложение для записи (начальных данных) и чтения из базы данных MySQL. Тем не менее, части зрения победили меня. Я пробовал различные примеры того, как создать и заполнить раскрывающийся список, но ни один из них не скомпилируется или не запустится для меня из-за отсутствующих элементов, даже после запуска «do tnet add package» и добавления ссылки на соответствующее пространство имен.

Хотя мое приложение должно работать только на Windows, я решил, что не хочу комбо-бокс, потому что он ресурсоемкий (мое приложение не будет компилироваться в любом случае даже после добавления необходимых ссылок и попытки перестроить . Я попал в путаницу с помощниками тегов и HTML помощниками и получил ряд различных ошибок. Я не пробовал примеры, в том числе «Viewbag», потому что не смог найти четкого описания того, что это такое, и по крайней мере один источник посоветовал не использовать его в любом случае.

Затем меня поразило, что я слишком усложняю вещи, потому что мое приложение успешно прочитало данные, необходимые в раскрывающемся списке, как показано на прилагаемом изображении. Это есть в модели (Home.cshtlml.cs) с использованием BookIt_Context.cs и сущностей, представляющих две таблицы здесь в P C .cs и Location.cs. Как показано на рисунке, мои образцы данных доступны и могут быть показаны в виде таблицы (для P C) и в виде простого текста для Location (список названий мест, расположенных вместе вверху). Однако, пытаясь показать другие выпадающие списки, другие методы давали ошибки, в которых говорилось, что «Имя» не было в Модели (хотя это явно так).

1008 * Теперь ошибки компиляции пошли, но выпадающий на участке упорно остается пустым. Кто-нибудь может сказать мне, почему? Требуется ли данным в Location ( publi c List Location {get; set;} = new List () ;) какой-то тип передачи, отображаемый в раскрывающемся списке? Извиняюсь, что пропустил что-то простое, но просто не вижу его. Снимок экрана
@page
@model HomeModel // Definition of this lives in the corresponding .cs file
@{
    ViewData["Title"]="BookIt Home";
}

<section id="main">
    @foreach(var loc in Model.Location) { @loc.Name }
    <br>
    <select name="OurLoc" id="OurLocBox">
        @foreach(var loc in Model.Location) { <option value="@loc.Name"></option> }
    </select>
    <table border="1" cellspacing="10" cellpadding="10">
    <tr> <!-- Header row -->
    <td><p><b>PC Name</b></p></td><td><p><b>Location</b></p></td><td><p><b>Workstn Name</b></p></td>
    </tr>
    @foreach(var pc in Model.PC)
    {
        <tr>
            <td><p>@pc.FriendlyName</p></td> <td><p>@pc.LocationID</p></td> <td><p>@pc.NetBIOSName</p></td>
        </tr>
    }
    </table>
</section>

Home.cs html .cs:

using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
using Pomelo.EntityFrameworkCore.MySql;
using Microsoft.AspNetCore.Mvc.RazorPages;
using BookIt.Data;
using BookIt.Models;

namespace BookIt.Pages
{
    public class HomeModel : PageModel
    {
        private readonly BookIt_Context db;

        public HomeModel(BookIt_Context db) => this.db = db;

        public List<PC> PC {get; set; } = new List<PC>();
        public List<Location> Location {get; set; } = new List<Location>();

        public async Task OnGetAsync()
        {
            PC = await db.PC.ToListAsync();
            Location = await db.Location.ToListAsync();
        }
    }
}

1 Ответ

1 голос
/ 26 апреля 2020

Вы установили значение для элементов DropDownList, но не для их текстов.

@foreach(var loc in Model.Location) 
{ 
   <option value="@loc.Name">@loc.Name</option> 
}
...