как загрузить изображение, используя страницу бритвы - PullRequest
0 голосов
/ 01 ноября 2018

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

public class Course
    {
        public int CourseID { get; set; }
        [Display(Name = "Course Code")]
        public string CourseCode { get; set; }
        [Display(Name = "Course Name")]
        public string Title { get; set; }
        public string Image { get; set; }
        public int Credits { get; set; }
        public int DepartmentID { get; set; }
        public string SmallSescription { get; set; }
        public string BigDescription { get; set; }
        [DataType(DataType.Date)]
        [Display(Name ="Date Launched")]
        public DateTime DateLaunched { get; set; }
        public Department Department { get; set; }
        public ICollection<Enrollment> Enrollments { get; set; }//many to many relationship with student
        public ICollection<CourseAssignment> CourseAssignments { get; set; }//many relationship with instructor.
    }

Это страница бритвы для создания модели курса.

@page
@model MyNamespace.CreateModel
@{
    ViewData["Title"] = "Create Course";
}
<h2>Create Course</h2>
<div class="row">
    <div class="col-md-4">
        <form method="post" enctype="multipart/form-data">
            <div asp-validation-summary="ModelOnly" class="text-danger"></div>
          @*markup removed for simplicity*@
            <div class="form-group">
                <label asp-for="Course.Image" class="control-label"></label>
                <input  type="file" name="files" multiple class="form-control" />
            </div>

            <div class="form-group">
                <input type="submit" value="Create" class="btn btn-default" />
            </div>
        </form>
    </div>
</div>
<div>
    <a asp-page="Index">Back to List</a>
</div>
@section Scripts {
    @{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}

и это метод OnPostAsync для CreateModel,

namespace MyNamespace
{
   public class CreateModel :PageModel
    {
        //other code removed for simplicity
        [BindProperty]
        public Course Course { get; set; }

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

            var emptyCourse = new Course();
            if (await TryUpdateModelAsync<Course>(emptyCourse, "course",   // Prefix for form value.
                 s => s.CourseCode, s => s.CourseID, s => s.DepartmentID, s => s.Title, s => s.Credits,s => s.Image))
            {
                _context.Courses.Add(emptyCourse);
                await _context.SaveChangesAsync();
            }

        //image being saved
        var files = HttpContext.Request.Form.Files;
        if (files[0] != null && files[0].Length > 0)
            {
            //save the extension name as well as images folder path inside the image proiperty of every course
            }
        else
            {
            //save a default image
            }
                return RedirectToPage("./Index");
        }  
    } 
} 

Я хочу получить файлы в HttpContext, используя var files = HttpContext.Request.Form.Files;, чтобы я мог сохранить путь к изображению в базе данных. но files.Count; равно нулю, когда изображение не загружено. Поэтому код

if (files[0] != null && files[0].Length > 0)
        {
            //save the extension name as well as images folder path inside the image proiperty of every course
        }

выдает исключение. Как я могу решить это? Я хочу, чтобы свойство Image содержало путь к изображению для курса. Есть ли лучший способ получить файлы, отправленные с запросом http?

1 Ответ

0 голосов
/ 01 ноября 2018

Если файлы не опубликованы, files[0] не null. Не существует Поэтому генерируется ArgumentOutOfRangeException. Если вы хотите работать с Request.Form.Files, вам следует вместо этого проверить значение Count:

if(Request.Form.Files.Count > 0)
{
    // you can safely access Request.Form.Files[0]
    //save the extension name as well as images folder path inside the image property of every course
}
...