Файл загрузки ядра Asp.net не запускает код OnPost - PullRequest
0 голосов
/ 27 октября 2019

Первым делом сначала я хочу извиниться, если эта тема была упомянута ранее, но я искал 2 дня и никогда не узнавал о своей проблеме.

Итак, у меня есть скрипт IFormFile, который не выдаетлюбая ошибка (по крайней мере, синтаксическая ошибка), но когда я на странице загрузки, я заполняю свои поля (имя, описание и файл) и нажимаю кнопку загрузки, мой код OnPost не запускается вообще, а моя страница просто обновляется.

Это моя бритва CREATE.CSHTML

@page
@model Appuntamenti.Models.ViewModel.DocumentCreateViewModel
@{
    ViewData["Title"] = "Create";
    Layout = "~/Pages/Shared/_Layout.cshtml";
}

<div>
    <h4>Upload Single file</h4>
</div>
<form method="post" enctype="multipart/form-data" runat="server" asp-action="OnPost"  class="mt-3">
    <div class="form-group row">
        <label asp-for="Name" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="Name" class="form-control" placeholder="Name..." />
            <span asp-validation-for="Name" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group row">
        <label asp-for="Description" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <input asp-for="Description" class="form-control" placeholder="Description..." />
            <span asp-validation-for="Description" class="text-danger"></span>
        </div>
    </div>
    <div class="form-group row">
        <label asp-for="Document" class="col-sm-2 col-form-label"></label>
        <div class="col-sm-10">
            <div class="custom-file">
                <input asp-for="Document" class="form-control custom-file-input" />
                <label class="custom-file-label">Choose File..</label>
            </div>
        </div>
    </div>
    <button type="submit" class="btn btn-success form-control"></button>


    @section  Scripts {
        <script>
            $(document).ready(function ()
            {
                $('.custom-file-input').on("change", function () {
                    var fileName = $(this).val().split("\\").pop();
                    $(this).next('.custom-file-label').html(fileName);
                });
            });
        </script>
    }
</form>

И это моя страница CREATE.CSHTML.CS

namespace Appuntamenti.Pages.Documents
{
    
    public class CreateModel : PageModel
    {
        private readonly ApplicationDbContext _db;
        private readonly IHostingEnvironment _hostingEnvironment;
       

        public CreateModel(ApplicationDbContext db, IHostingEnvironment hostingEnvironment)
        {
            _db = db;
            _hostingEnvironment = hostingEnvironment;
        }


       
        [HttpPost]
        
        public async Task<IActionResult> OnPostAsync (DocumentCreateViewModel model)
        {
            if (!ModelState.IsValid)
            {
                return NotFound();
            }
            string uniqueFileName = null;
            if(model.Document != null)
            {
                string uploadsFolder = Path.Combine(_hostingEnvironment.WebRootPath, "Documents");
                uniqueFileName = Guid.NewGuid().ToString() + "_" + model.Document.FileName;
                string filePath = Path.Combine(uploadsFolder, uniqueFileName);
                await model.Document.CopyToAsync(new FileStream(filePath, FileMode.Create));

            }

            DocumentModel newDocument = new DocumentModel
            {
                Id = model.Id,
                Name = model.Name,
                Description = model.Description,
                DocumentPath = uniqueFileName
            };
            _db.Add(newDocument);
            _db.SaveChanges();
            return RedirectToPage("./Index");
        }

    }
}

И это мои 2 модели для IFormFile

    public class DocumentModel
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Description { get; set; }
        [Required]
        public string DocumentPath { get; set; }
    }
    
    
    
        public class DocumentCreateViewModel
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        [Required]
        public string Description { get; set; }
        [Required]
        
        public IFormFile Document { get; set; }


        
    }
    

В общем, я пытался установить точку останова на методе Post, но он вообще не срабатывает, я пытался запустить веб-сайт и проверить элементы, заголовок, сеть и все остальное. это нормально.

После некоторого просмотра я прочитал, что метод Onpost с IFormFile полагается на TokenValidation, я попытался проигнорировать проверку и посмотреть, если что-то изменилось, но ничего. Я действительно не знаю, что я делаю неправильно.

Я надеюсь, что разъяснил свою точку зрения и проблему, и, пожалуйста, если вам нужна дополнительная информация, просто дайте мне знать

1 Ответ

0 голосов
/ 28 октября 2019

Вы перепутали Asp.Net Core MVC и Razor Page.

Выполните следующие действия:

  1. CreateModel

    public class CreateModel : PageModel
    {
        [BindProperty]
        public DocumentCreateViewModel DocumentCreateViewModel { get; set; }
    
        //[HttpPost]
        public async Task<IActionResult> OnPostAsync()
        {
            return RedirectToPage("./Index");
        }
    
  2. View

    @page
    @model CreateModel
    @{
        ViewData["Title"] = "Create";
        Layout = "~/Pages/Shared/_Layout.cshtml";
    }
    
    <div>
        <h4>Upload Single file</h4>
    </div>
    <form method="post" enctype="multipart/form-data">
        <div class="form-group row">
            <label asp-for="DocumentCreateViewModel.Name" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="DocumentCreateViewModel.Name" class="form-control" placeholder="Name..." />
                <span asp-validation-for="DocumentCreateViewModel.Name" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="DocumentCreateViewModel.Description" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <input asp-for="DocumentCreateViewModel.Description" class="form-control" placeholder="Description..." />
                <span asp-validation-for="DocumentCreateViewModel.Description" class="text-danger"></span>
            </div>
        </div>
        <div class="form-group row">
            <label asp-for="DocumentCreateViewModel.Document" class="col-sm-2 col-form-label"></label>
            <div class="col-sm-10">
                <div class="custom-file">
                    <input asp-for="DocumentCreateViewModel.Document" type="file" class="form-control custom-file-input" />
                    <label class="custom-file-label">Choose File..</label>
                </div>
            </div>
        </div>
        <button type="submit" class="btn btn-success form-control"></button>
        @*<input type="submit" value="Submit" />*@
    
    </form>
    
    @section Scripts {
        @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
    
        <script>
            $(document).ready(function () {
                $('.custom-file-input').on("change", function () {
                    var fileName = $(this).val().split("\\").pop();
                    $(this).next('.custom-file-label').html(fileName);
                });
            });
        </script>
    }
    

Для получения дополнительной информации о странице Razor см. Введение в страницы Razor в ASP.NET Core

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