I wrote a program with asp.net core.
In this program, the user enters the required information about an article (such as the image and description text, etc.) and then presses the “upload article” button. The image of the article is uploaded and other information is also stored in the database. Normally everything works fine.
But
The problem happens when an exception occurs (or an exception is thrown) and I display the view again. When the view is displayed again, the value of “mainImage” corresponding to the image of the article becomes null.
**How can I prevent it from becoming null or restore its value?
**
my view:
@model DataLayer.Article
@{
var errorMessage = "";
var hasError = false;
if (TempData["ExceptionMessage"] != null)
{
hasError = true;
errorMessage = @TempData["ExceptionMessage"].ToString();
<div class="alert alert-danger fill">
<i class="icon-check"></i>
<strong>خطا!</strong>
@errorMessage
</div>
}
}
@Html.AntiForgeryToken()
<div class="row">
<form method="POST" enctype="multipart/form-data" id="CreateArticleForm" >
<fieldset>
@Html.HiddenFor(Model => Model.ArticleId)
<div class="panel panel-success box shadow">
<div class="panel-heading">
<div class="panel-title">
<a id="tab1lbl"> اطلاعات کلی</a>
<div class="vl"></div>
<a id="tab2lbl">متن توضیحات</a>
</div><!-- /.panel-title -->
</div><!-- /.panel-heading -->
<div class="wizard-step" id="tab1">
<!-- اطلاعات کلی-->
<div class="form-group ">
<div class="input-group">
<span>
<i class="far fa-circle-question"></i>
<label asp-for="IsStaticPost" class="control-label"></label>
</span>
<input type="checkbox" asp-for="IsStaticPost" style="margin-right: 10px;" />
</div><!-- /.input-group -->
<span asp-validation-for="IsStaticPost" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group relative">
<input type="file" class="form-control" accept="image/jpeg" name="mainImage" >
<label asp-for="ImageName" class="control-label"></label>
<div class="input-group round">
<span class="input-group-addon">
<i class="icon-picture"></i>
</span>
<input type="text" asp-for="ImageName" class="form-control file-input"
placeholder="برای انتخاب کلیک کنید" >
</div><!-- /.input-group -->
<span asp-validation-for="ImageName" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ImageAlt" class="control-label"></label>
<div class="input-group">
<span class="input-group-addon">
<img src="~/Images/ImageAlt.svg" />
</span>
<input asp-for="ImageAlt" class="form-control" />
</div><!-- /.input-group -->
<span asp-validation-for="ImageAlt" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group">
<label asp-for="ImageTitle" class="control-label"></label>
<div class="input-group">
<span class="input-group-addon">
<img src="~/Images/ImageTitle.svg" />
</span>
<input asp-for="ImageTitle" class="form-control" />
</div><!-- /.input-group -->
<span asp-validation-for="ImageTitle" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group">
<label asp-for="ShortDescription" class="control-label"></label>
<div class="input-group">
<span class="input-group-addon">
<img src="~/Images/tag32.png" />
</span>
<input asp-for="ShortDescription" class="form-control" />
</div><!-- /.input-group -->
<span asp-validation-for="ShortDescription" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group">
<label asp-for="BrowserTitle" class="control-label"></label>
<div class="input-group">
<span class="input-group-addon">
<i class="fas fa-earth-asia"></i>
</span>
<input asp-for="BrowserTitle" class="form-control" />
</div><!-- /.input-group -->
<span asp-validation-for="BrowserTitle" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group">
<label asp-for="Title" class="control-label"></label>
<div class="input-group">
<span class="input-group-addon">
<img src="~/Images/tag32.png" />
</span>
<input asp-for="Title" class="form-control" />
</div><!-- /.input-group -->
<span asp-validation-for="Title" class="text-danger"></span>
</div><!-- /.form-group -->
</div><!-- /.wizard-step -->
<div class="wizard-step" id="tab2">
<!-- متن توضیحات-->
<div class="form-group">
<label asp-for="Text" class="control-label"></label>
<div class="input-group">
<textarea asp-for="Text"></textarea>
</div><!-- /.input-group -->
<span asp-validation-for="Text" class="text-danger"></span>
</div><!-- /.form-group -->
<div class="form-group">
<label class="control-label">کلمات کلیدی</label>
<div class="input-group">
<span class="input-group-addon">
<img src="~/Images/tag32.png" />
</span>
<input type="text" name="tags" placeholder="لطفا کلمات کلیدی را با , از هم جداکنید" class="form-control" value="@ViewBag.Tags"/>
</div><!-- /.input-group -->
</div><!-- /.form-group -->
</div>
<div class="wizard-nav">
<button type="button" id="wizard-prev" class="btn btn-primary">
<i class="fas fa-angles-right"></i>
قبلی
</button>
<button type="button" id="wizard-next" class="btn btn-danger">
<i class="fas fa-angles-left"></i>
بعدی
</button>
@* upload article button *@
<button type="submit" id="wizard-submit" class="btn btn-success">
<i class="fas fa-upload"></i>
بارگذاری مقاله
</button>
</div>
</div>
</fieldset>
</form>
</div>
@section Scripts {
<script src="~/assets/plugins/ckeditor/ckeditor.js"></script>
<script src="~/assets/plugins/ckeditor/adapters/jquery.js"></script>
<script src="~/assets/plugins/iCheck/icheck.min.js"></script>
@{
await Html.RenderPartialAsync("_ValidationScriptsPartial");
}
<script>
$(function () {
$('#Text').ckeditor();
});
</script>
}
my action method:
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Create([Bind("ImageTitle,ImageAlt,ShortKey,ArticleId,ImageName,BrowserTitle,ShortDescription,Title,Text,CreateOrUpdateDate,FauthorId,IsPublished,IsStaticPost")] Article article,
IFormFile mainImage, string? tags)
{
string farsiError;
string srcImg;
string[] tagArray;
string imageName;
Guid articleId;
AdminUser author;
bool isExistsStaticPost;
try
{
ModelState.Remove("Fauthor");
ModelState.Remove("ShortKey");
// if (!ModelState.IsValid && mainImage==null && ModelState.Keys.)
if (ModelState.IsValid)
{
if ((mainImage != null) && (mainImage.Length > _maxImageSize))
{
ModelState.AddModelError("ImageName", "حجم تصویر اصلی بیشتر از 100 کیلوبایت نمی تواند باشد.");
ViewBag.Tags = tags;
return View();
}
isExistsStaticPost = _context.Articles.Any(a => a.IsStaticPost);
if (isExistsStaticPost && article.IsStaticPost)
{
farsiError = "یک مطلب قبلا بصورت پست ثابت تعریف شده است. ابتدا آن را از حالت پست ثابت خارج کنید.";
throw new Exception(farsiError);
}
else
{
article.ShortKey = GenerateShortKey();
author = _context.AdminUsers.Where(u => u.Username == HttpContext.User.Identity.Name).FirstOrDefault();
article.Fauthor = author;
article.FauthorId = author.Id;
articleId = article.ArticleId;
imageName = "No-Image.jpg";
if (mainImage != null && CheckContentImage.IsImage(mainImage))
{
imageName = Guid.NewGuid().ToString() + Path.GetExtension(mainImage.FileName);
srcImg = _imgFolder + imageName;
article.ImageName = imageName;
if (mainImage.Length > 0)
{
using (Stream fileStream = new FileStream(srcImg, FileMode.Create, FileAccess.Write))
{
mainImage.CopyTo(fileStream);
}
}
ImageResizer resizer = new ImageResizer();
resizer.Resize(srcImg, _thumbFolder + imageName);
}
article.CreateOrUpdateDate = DateTime.Now;
_context.Articles.Add(article);
if (!string.IsNullOrEmpty(tags))
{
tagArray = tags.Split(',');
foreach (string tag in tagArray)
{
_context.ArticleTags.Add(new DataLayer.ArticleTag()
{
FarticleId = articleId,
TagText = tag.Trim()
});
}
}
await _context.SaveChangesAsync();
return RedirectToAction(nameof(Index));
}
}
}
catch (Exception ex)
{
farsiError = ex.GetFarsiMessage(); //پیغام مناسب فارسی برای تکرای بودن
TempData["ExceptionMessage"] = farsiError;
ViewBag.Tags = tags;
}
return View();
}