我用asp.net core写了一个程序。 在此程序中,用户输入有关文章的所需信息(例如图像和描述文本等),然后按“上传文章”按钮。文章的图片被上传,其他信息也被存储在数据库中。通常一切正常。 但 当发生异常(或引发异常)并且我再次显示视图时,就会出现问题。当视图再次显示时,文章图片对应的“mainImage”的值变为null。
**如何防止它变为null或恢复它的值? **
我的看法:
@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>
}
我的行动方法:
[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();
}
您不能,因为返回的视图是一个全新的页面,并且您无法设置文件输入的值。
您可以使用ajax提交表单并使用javascript处理服务器的响应,重定向或显示警报消息。