Action方法内发生异常时如何保留iformfile?

问题描述 投票:0回答:1

我用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();


  }
c# asp.net-mvc asp.net-core
1个回答
0
投票

您不能,因为返回的视图是一个全新的页面,并且您无法设置文件输入的值。

您可以使用ajax提交表单并使用javascript处理服务器的响应,重定向或显示警报消息。

© www.soinside.com 2019 - 2024. All rights reserved.