I've been trying for a while to try to get my project to accept image files and submit them to my database, but to no avail. Everything I see is 10+ years old and no longer works. It's just the basic Edit view for MVC, I just beefed up security.
public async Task<IActionResult> Edit([Bind("UserId,Name,Email,Password,Type,EmailConfirm,Pfp")] UserIdentity userIdentity)
{
//check if user is logged in for this action
if (HttpContext.Session.GetInt32("sessionUserID") == null || HttpContext.Session.GetInt32("sessionUserID") <= 0)
{
ViewBag.reasonFailed = "You need to log in before doing this!";
return View("Failed");
}
//for use in LINQ queries
MySchoolDataContext dbContext = new();
//checks if the user is an admin
if ((from user in dbContext.UserIdentities where user.UserId == userIdentity.UserId select user.Type).FirstOrDefault().Equals("A"))
{
}
else
{
//Checking if the userID matches the id in the URL
if (HttpContext.Session.GetInt32("sessionUserID") != userIdentity.UserId)
{
ViewBag.reasonFailed = "You cannot edit an account that isn't your own!";
return View("Failed");
}
//checks if the email is confirmed
if ((from user in dbContext.UserIdentities where user.UserId == HttpContext.Session.GetInt32("sessionUserID") select user.EmailConfirm).FirstOrDefault().Equals("n"))
{
return RedirectToAction("confirmEmail");
}
}
if (userIdentity.UserId != userIdentity.UserId)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
_context.Update(userIdentity);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserIdentityExists(userIdentity.UserId))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(userIdentity);
}
The view I'm using:
@model Rideshare.Models.UserIdentity
@{
ViewData["Title"] = "Edit";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<h1>Edit</h1>
<h4>UserIdentity</h4>
<hr />
<div class="row">
<div class="col-md-4">
<form asp-action="Edit">
<div asp-validation-summary="ModelOnly" class="text-danger"></div>
<input type="hidden" asp-for="UserId" />
<div class="form-group">
<label asp-for="Name" class="control-label"></label>
<input asp-for="Name" class="form-control" />
<span asp-validation-for="Name" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Email" class="control-label"></label>
<input asp-for="Email" class="form-control" />
<span asp-validation-for="Email" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Password" class="control-label"></label>
<input asp-for="Password" class="form-control" />
<span asp-validation-for="Password" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Type" class="control-label"></label>
<input asp-for="Type" class="form-control" />
<span asp-validation-for="Type" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="EmailConfirm" class="control-label"></label>
<input asp-for="EmailConfirm" class="form-control" />
<span asp-validation-for="EmailConfirm" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="Pfp" class="control-label"></label>
<input asp-for="Pfp" type="file" class="form-control" />
<span asp-validation-for="Pfp" class="text-danger"></span>
</div>
<div class="form-group">
<input type="submit" value="Save" class="btn btn-primary" />
</div>
</form>
</div>
</div>
<div>
<a asp-action="Index">Back to List</a>
</div>
@section Scripts {
@{await Html.RenderPartialAsync("_ValidationScriptsPartial");}
}
Thank you for any help you give. This is for a school project and not even my professor knows how to pull it off. I've asked.
Edit: Someone asked for the model that I'm using for it, so here it is.
using System;
using System.Collections.Generic;
#nullable disable
namespace Rideshare.Models
{
public partial class UserIdentity
{
public UserIdentity()
{
HistoryDrivers = new HashSet<History>();
HistoryPasses = new HashSet<History>();
RatingRaters = new HashSet<Rating>();
RatingUsers = new HashSet<Rating>();
}
public int UserId { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string Type { get; set; }
public string EmailConfirm { get; set; }
public byte[] Pfp { get; set; }
public virtual ICollection<History> HistoryDrivers { get; set; }
public virtual ICollection<History> HistoryPasses { get; set; }
public virtual ICollection<Rating> RatingRaters { get; set; }
public virtual ICollection<Rating> RatingUsers { get; set; }
}
}
class. Also, I hope you're not using an EF entity class as a read/write view-model? (That's a recipe for disaster...)IFormFile. So you need changebyte[] PfptoIFormFile Pfp. If you want to save to database, you can replace Pfp input with<input name="file" type="file" class="form-control" />and receive the value byHttpContext.Request.Form["file"]and try to convert it to byte array.<form>hasenctype="multipart/form-datatoo.