ASP Core Razor - Как загрузить файл в базу данных SQL?

Я давно создал приложение для работы, используя ASP.NET. Сейчас я переписываю приложение, используя страницы Razor (ядро ASP.NET). Прошу прощения, если вопрос слишком прост или ответ на него уже был где-то в другом месте. Я искал несколько дней! У меня возникли трудности с загрузкой файла в таблицу.

Модель выглядит так:

using System;
using System.Collections.Generic;

namespace FinplianceProject.Models
{
    public partial class TblSdgs
    {
        public int IntSdgId { get; set; }
        public string StrSdgShort { get; set; }
        public string StrSdgLong { get; set; }
        public byte[] ImgSdgIconNormal { get; set; }
        public byte[] ImgSdgIconInverted { get; set; }
    }
}

Моя страница бритвы выглядит так:

@page
@model FinplianceProject.Pages.SDGs.EditModel

@{
    ViewData["Title"] = "Edit";
}

<h2>Edit</h2>

<h4>TblSdgs</h4>
<hr />
<div class = "row">
    <div class = "col-md-4">
        <form method = "post"  enctype = "multipart/form-data" asp-controller = "UploadFiles" asp-action = "Index">
            <div asp-validation-summary = "ModelOnly" class = "text-danger"></div>
            <input type = "hidden" asp-for = "TblSdgs.IntSdgId" />
            <div class = "form-group">
                <label asp-for = "TblSdgs.StrSdgShort" class = "control-label"></label>
                <input asp-for = "TblSdgs.StrSdgShort" class = "form-control" />
                <span asp-validation-for = "TblSdgs.StrSdgShort" class = "text-danger"></span>
            </div>
            <div class = "form-group">
                <label asp-for = "TblSdgs.StrSdgLong" class = "control-label"></label>
                <input asp-for = "TblSdgs.StrSdgLong" class = "form-control" />
                <span asp-validation-for = "TblSdgs.StrSdgLong" class = "text-danger"></span>
            </div>
            <div class = "form-group">
                <label asp-for = "TblSdgs.ImgSdgIconNormal" class = "control-label"></label>
                <input type = "file" asp-for = "TblSdgs.ImgSdgIconNormal" />
            </div>
            <div class = "form-group">
                <label asp-for = "TblSdgs.ImgSdgIconInverted" class = "control-label"></label>
                <input type = "file" asp-for = "TblSdgs.ImgSdgIconInverted" />
            </div>
            <div class = "form-group">
                <input type = "submit" value = "Save" class = "btn btn-default" />
            </div>
        </form>
    </div>
</div>

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

@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

Бэкэнд выглядит так:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.RazorPages;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.EntityFrameworkCore;
using FinplianceProject.Models;

namespace FinplianceProject.Pages.SDGs
{
    public class EditModel : PageModel
    {
        private readonly FinplianceProject.Models.DB_19456_ccsolutions1Context _context;

        public EditModel(FinplianceProject.Models.DB_19456_ccsolutions1Context context)
        {
            _context = context;
        }

        [BindProperty]
        public TblSdgs TblSdgs { get; set; }

        public async Task<IActionResult> OnGetAsync(int? id)
        {
            if (id == null)
            {
                return NotFound();
            }

            TblSdgs = await _context.TblSdgs.FirstOrDefaultAsync(m => m.IntSdgId == id);

            if (TblSdgs == null)
            {
                return NotFound();
            }
            return Page();
        }

        public async Task<IActionResult> OnPostAsync()
        {
            if (!ModelState.IsValid)
            {
                return Page();
            }

            _context.Attach(TblSdgs).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
            }
            catch (DbUpdateConcurrencyException)
            {
                if (!TblSdgsExists(TblSdgs.IntSdgId))
                {
                    return NotFound();
                }
                else
                {
                    throw;
                }
            }

            return RedirectToPage("./Index");
        }

        private bool TblSdgsExists(int id)
        {
            return _context.TblSdgs.Any(e => e.IntSdgId == id);
        }
    }
}

На странице отображается «ОК» с работающим элементом управления загрузкой файлов, но когда я нажимаю «Сохранить», файлы не сохраняются.

Пожалуйста, помогите и заранее спасибо!

Добро пожаловать в СО! Являются ли ImgSdgIconNormal и ImgSdgIconInverted нулевыми, когда вы выполняете метод POST?

chakeda 01.03.2019 23:22

Да, они нулевые

Pierre Sogol 01.03.2019 23:23

В этом ответе подробно описано, как использовать свойство viewmodel IFormFile и как сохранить массив байтов в базе данных: stackoverflow.com/questions/35379309/…

chakeda 01.03.2019 23:46

Спасибо, Чака. Где находится модель представления на странице бритвы? Я вижу модель страницы, но не модель представления. Кроме того, где метод действия GET? Спасибо.

Pierre Sogol 02.03.2019 02:03

Проверьте следующий учебник: Отправка файлов на страницу Razor в ASP.NET Core

Nan Yu 04.03.2019 10:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
1 716
0

Другие вопросы по теме