我一直在嘗試讓我的專案接受影像檔案并將它們提交到我的資料庫,但無濟于事。我看到的一切都是 10 歲以上的,不再有效。這只是 MVC 的基本編輯視圖,我只是加強了安全性。
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);
}
我正在使用的視圖:
@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");}
}
感謝您提供的任何幫助。這是一個學校專案,甚至我的教授都不知道如何完成它。我問過。
編輯:有人要我使用的模型,所以就在這里。
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; }
}
}
uj5u.com熱心網友回復:
我完全改變了這一點,因為我將影像轉換為位元組陣列的方式有點錯誤。實際上有一個非常簡單的方法可以做到這一點!只是花了很多谷歌搜索和兔子洞(也是我的老師!)。我只使用了MemoryStreamand IFormFileto 因為你可以直接從一個轉換到另一個。
public async Task<IActionResult> ChangePfp(IFormFile theFile, [Bind("UserId,Name,Email,Password,Type,EmailConfirm,Pfp")] UserIdentity userIdentity)
{
//check file length just in case of null
if (theFile.Length > 0)
{
//converting the image(file) to a byte array(MemoryStream)
using (MemoryStream mStream = new())
{
theFile.CopyTo(mStream);
userIdentity.Pfp = mStream.ToArray();
}
}
else
{
return View();
}
if (ModelState.IsValid)
{
try
{
_context.Update(userIdentity);
await _context.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!UserIdentityExists(userIdentity.UserId))
{
ViewBag.reasonFailed = "Not found";
return View("Failed");
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(userIdentity);
}
這是我以前做的代碼,但為了更容易閱讀并使其部分私有化,洗掉了大部分代碼。真的就是這么簡單。要將其轉換回視圖中,您所要做的就是在您想要的視圖中執行此操作:
@if (Model.Pfp != null)
{
<img src="data:image/jpeg;base64,@(Convert.ToBase64String(Model.Pfp))"/>
}
感謝所有試圖提供幫助的人!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/444899.html
標籤:C# html asp.net-mvc asp.net 核心
