У меня есть форма, которая отображает текущие данные участника, включая его фотографию. Под своей фотографией он может загрузить другую, и я заменяю старую фотографию новой в моем контроллере.
Моя проблема в том, что я не могу восстановить изображение в своей модели, оно всегда равно нулю (остальное идет отлично).
В моей модели я объявил переменную Member_UploadPicture
типа IFormFile
.
Я следил за недавним руководством Microsoft (https://docs.microsoft.com/en-us/aspnet/core/mvc/models/file-uploads?view=aspnetcore-2.2), но ничего не работает, все равно null.
Я пробовал с @Html.Editor
с именем переменной, а также с <input type = file>
, но 2 всегда равны нулю.
У тебя есть идея?
Модель
public class MemberViewModel
{
public string Member_NameFirst { get; set; }
public string Member_NameLast { get; set; }
public byte[] Member_Picture { get; set; }
public IFormFile Member_UploadPicture { get; set; }
public string Member_Picture_Show { get; set; }
// other properties...
}
Контроллер
[Authorize(Roles = "Member, Admin")]
[HttpPost]
public async Task<IActionResult> GetMember(MemberViewModel model)
{
if (ModelState.IsValid)
{
var MembertoUpdate = new MemberViewModel
{
//code
};
using (var memomyStream = new MemoryStream())
{
await model.Member_UploadPicture.CopyToAsync(memomyStream);
MembertoUpdate.Member_Picture = memomyStream.ToArray();
}
return Ok(model);
}
else return BadRequest();
}
Вид
@using (Html.BeginForm(null, null, FormMethod.Post, new { id = "formAll", style = "margin-top:3%", enctype = "multipart/form-data" }))
{
<div class = "panel panel-primary">
<div class = "panel-heading">
<h3 class = "panel-title">Personnal</h3>
</div>
<div class = "panel-body">
<div id = "formMember" class = "row col-xs-12">
@Html.ValidationSummary(true, "", new { @class = "text-danger" })
<div class = "col-xs-6">
<div class = "form-check-inline col-xs-12" style = "margin-top:2%">
<img id = "ItemPreview" src = "data:image/png;base64, @Model.Member_Picture_Show" style = "height:200px; width:200px; margin-left:35%; border:solid 1px black">
</div>
<div class = "form-check-inline col-xs-12" style = "margin-top:2%; margin-left:35%">
@Html.LabelFor(model => model.Member_UploadPicture, "Upload Picture", new { htmlAttributes = new { @id = "test" } })
@Html.EditorFor(model => model.Member_UploadPicture, new { htmlAttributes = new { @class = "form-control-file", @id = "Member_UploadPicture" } })
<input type = "file" class = "form-control-file" name = "Member_UploadPicture" id = "Member_UploadPicture">
<small id = "fileHelp" class = "form-text text-muted">Maximum 1024kb</small>
</div>
</div>
</div>
</div>
</div>
}
Ajax Call
function Edit() {
$(function () {
$("#formAll").submit(function (event) {
event.preventDefault();
var formData = $("#formAll").serialize();
$.ajax({
url: "https://localhost:44338/Members/GetMember/",
type: 'POST',
data: formData,
dataType: 'json',
success: function (data) {
//code
},
error: function (error) {
//code
}
});
})
});
}
Удалить
@Html.EditorFor(model => model.Member_UploadPicture, new { htmlAttributes = new { @class = "form-control-file", @id = "Member_UploadPicture" } })
добавить к вам запрос ajax
processData: false,
contentType: false,
Для var formData = $("#formAll").serialize();
он не может сериализовать IFormFile
, вам нужно добавить IFormFile
к formData
.
<script type = "text/javascript">
$(document).ready(function () {
$("#formAll").submit(function (event) {
event.preventDefault();
var formData = new FormData();
formData.append('Member_NameFirst', $('#Member_NameFirst').val());
formData.append('Member_UploadPicture', $('#Member_UploadPicture')[0].files[0]);
$.ajax({
url: "https://localhost:44307/home/getmember",
type: 'POST',
data: formData,
dataType: 'json',
processData: false,
contentType: false,
success: function (data) {
//code
},
error: function (error) {
//code
}
});
}) })
</script>
Спасибо за вашу помощь. Member_UploadPicture по-прежнему имеет значение null, когда контроллер получает модель (значение имеет только Member_NameFirst), есть ли предположения?
@Korpin Есть ли демо для воспроизведения вашей проблемы?
Кстати, представление находится в файле участников (из файла представлений) :-)
@Korpin Вам нужно внимательно проверить свой код, вы никогда не устанавливали Member_UploadPicture
в ajax.
Вау, вы правы ... Я почти уверен, что сделал это, потому что изначально я скопировал / вставил ваш код, но да, не знаю, что произошло! Теперь это работает .. Извините за это и большое спасибо!
Да, я только что заметил, что изображения нет в моем вызове ajax, я полагаю, поэтому он имеет значение null в моей модели ... Я только что отредактировал свой код с помощью вызова ajax.