Получение данных из базы данных в ASP. NET Razor Pages - PullRequest
0 голосов
/ 18 января 2020

Я нашел в Интернете, как отправить изображение, загруженное от пользователя, в мою базу данных. Вот код, который я использую:

Create.cs html

@page
@model SummerFling.Pages.Products.CreateModel

@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Create</title>
</head>
<body>

<h4>Product</h4>
<hr />
<div class="row">
    <div class="col-md-4">
        <form enctype="multipart/form-data" method="post">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
            <div class="form-group">
                <label asp-for="Product.ProductName" class="control-label"></label>
                <input asp-for="Product.ProductName" class="form-control" required />
                <span asp-validation-for="Product.ProductName" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Product.ProductShortDesc" class="control-label"></label>
                <input asp-for="Product.ProductShortDesc" class="form-control" required />
                <span asp-validation-for="Product.ProductShortDesc" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Product.ProductLongDesc" class="control-label"></label>
                <input asp-for="Product.ProductLongDesc" class="form-control" required />
                <span asp-validation-for="Product.ProductLongDesc" class="text-danger"></span>
            </div>
            <div class="form-group">
                <label asp-for="Product.ProductPrice" class="control-label"></label>
                <input asp-for="Product.ProductPrice" class="form-control" required />
                <span asp-validation-for="Product.ProductPrice" class="text-danger"></span>
            </div>
            <dl>
                <dt>
                    <label asp-for="FileUpload.FormFile"></label>
                </dt>
                <dd>
                    <input asp-for="FileUpload.FormFile" type="file" required>
                </dd>
            </dl>
            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-primary" />
            </div>
        </form>
    </div>
</div>

<div>
    <a asp-page="Index">Back to List</a>
</div>

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
</body>
</html>

И в файле класса Create.cs html .cs я есть код, который получает данные из формы и отправляет их в мою базу данных:

Create.cs html .cs

// To protect from overposting attacks, please enable the specific properties you want to bind to, for
// more details see https://aka.ms/RazorPagesCRUD.
public async Task<IActionResult> OnPostAsync()
{
    if (!ModelState.IsValid)
    {
        return Page();
    }

    using (var memoryStream = new MemoryStream())
    {
        await FileUpload.FormFile.CopyToAsync(memoryStream);

        // Upload the file if less than 2 MB
        if (memoryStream.Length < 2097152)
        {
            var imageRecord = new Image()
            {
                ProductImage1 = memoryStream.ToArray()
            };

            _context.Image.Add(imageRecord); // Add the created image record to the Image database.

            await _context.SaveChangesAsync();

            _context.Product.Add(Product); // Add the created product record to the Product database

            await _context.SaveChangesAsync();

            return RedirectToPage("./Index");
        }
        else
        {
            ModelState.AddModelError("File", "The file is too large.");
            return Page();
        }
    }

}

Теперь, на / Index page Я хочу получить все данные, хранящиеся в моей базе данных, и показать их на странице. У меня нет проблем с этим для данных, хранящихся в таблице Product, но я изо всех сил пытаюсь понять логику c того, как я должен делать это для изображений, хранящихся в таблице Image.

Index.cs html

@page
@model SummerFling.Pages.Products.IndexModel
@using WebMatrix.Data;

@{
    Layout = null;
    var queryString = "SELECT ProductImage1 FROM Image WHERE ProductID LIKE @0";
    var db = Database.Open("SummerFlingProductContext");

    // appsettings.json
    //   "ConnectionStrings": {
    //       "SummerFlingProductContext": "Server=127.0.0.1,1433;Database=SummerFling;User Id=SA;Password=******;MultipleActiveResultSets=true"
    //    }

}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <p>
        <a asp-page="Create">Create New</a>
    </p>
    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.Product[0].ProductName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Product[0].ProductShortDesc)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Product[0].ProductLongDesc)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.Product[0].ProductPrice)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model.Product)
            {

                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.ProductName)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ProductShortDesc)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ProductLongDesc)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ProductPrice)
                    </td>
                    <td>
                        @db.QuerySingle(queryString, item.ProductID);
                    </td>
                    <td>
                        <a asp-page="./Edit" asp-route-id="@item.ProductID">Edit</a> |
                        <a asp-page="./Details" asp-route-id="@item.ProductID">Details</a> |
                        <a asp-page="./Delete" asp-route-id="@item.ProductID">Delete</a>
                    </td>
                </tr>
            }
        </tbody>
    </table>
</body>
</html>

Index.cs html .cs

namespace SummerFling.Pages.Products
{
    public class IndexModel : PageModel
    {
        private readonly SummerFling.Data.SummerFlingProductContext _context;

        public IndexModel(SummerFling.Data.SummerFlingProductContext context)
        {
            _context = context;
        }

        public IList<Product> Product { get; set; }
        public IList<Image> Image { get; set; }

        public async Task OnGetAsync()
        {
            Product = await _context.Product.ToListAsync();
            IList<Image> Image = await _context.Image.ToListAsync();
        }
    }
}

Я изо всех сил пытаюсь понять, где и как я должен кодировать логи c, чтобы получить изображения из таблицы изображений и показать изображение вместе со всеми другими данными для каждой строки. (В данный момент запись 1 в таблице изображений содержит изображения, относящиеся к записи 1 в таблице «Продукт».)

Кодировать это в файле .cs html .cs аналогично тому, как данные из таблицы Product получены? И как мне это сделать?

1 Ответ

0 голосов
/ 18 января 2020

Вам необходимо получить изображение в контроллере, которое отображает ваше Index.cshtml представление. Также добавьте изображение в ваш (список) IndexModel и отобразите его так же, как вы отображаете ProductName и ProductShortDes.

Как правило, вы хотите иметь как можно меньше логик c в представлении, особенно в базе данных c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...