当模型无效时,MVC5 GetImageFromRequest为null

时间:2016-03-01 16:56:26

标签: c# asp.net-mvc image controller asp.net-mvc-5

我正在做一个asp net MVC5 Web应用程序。我有一个带有下一个属性的ViewModel:

public class ExampleViewModel //: IValidatableObject
{
   ...
   public string name { get; set; }
   public string Foto { get; set; }
   ...
}

我在视图中上传图片:

@using (Html.BeginForm("Create", "Ingresos", FormMethod.Post, new { @encType = "multipart/form-data" }))
{
  ...

 <div class="form-group">
    @Html.LabelFor(model => model.Foto, htmlAttributes: new { @class = "control-label col-md-3" })
    <div class="col-md-9">
         <input type="file" id="imagen" name="imagen" class="hidden" accept="image/*" />
          @if (Model != null && Model.Foto != null)
          {
              <img src="@Model.Foto" class="thumb" id="preview" />
          }
          else
          {
              <img class="thumb" id="preview" hidden />
           }
           <label class="btn btn-default" for="imagen">Examinar...</label>
           <label id="mensajeErrorImagen"></label>
           <br />
           @if (Model != null && Model.Foto != null)
           {
               <a id="botonEliminar" onclick="eliminarImagen()" style="cursor: pointer;">[Eliminar]</a>
           }
           else
           {
               <a id="botonEliminar" onclick="eliminarImagen()" style="cursor: pointer;"></a>
           }
    </div>
 </div>

 ...
}

在控制器中我得到了这种形象

public ActionResult Create( ExampleViewModel ivm ){
   WebImage imagenW = WebImage.GetImageFromRequest();
   if (imagenW != null)
   {
      ivm.Foto = "data:image/png;base64," + Convert.ToBase64String(imagenW.GetBytes());
   }
   if (Model.IsValid){
     //do something...
   }
   return (View(ivm))
}

当模型有效时,这对我很有用。当模型无效时,图像将加载到视图中,但控制器imagenW中的图像为空。 到底是怎么回事?

修改

发生错误的场景如下:

  1. 我填写了带有图片的表单和字段中的一些错误,我提交了。
  2. 显示的视图包含错误menssage和上传图像的预览。
  3. 我再次提交表格而没有任何变化。
  4. 视图再次显示并显示相同的错误消息,但这次图像的预览为空。
  5. imagenW在表单中连续第二次出现验证错误时为空。

1 个答案:

答案 0 :(得分:1)

因为此错误仅在发布的第二次出现 所以你必须把它保存在像隐藏字段

这样的地方
@Html.HiddenFor(x=> x.Foto);

你必须检查Model.Foto == null是否从imagenW读取 从Model.Foto

中读取

代码将是

public ActionResult Create( ExampleViewModel ivm ){
          if(ivm.Foto ==null){
               WebImage imagenW = WebImage.GetImageFromRequest();
               if (imagenW != null)
               {
                   ivm.Foto = "data:image/png;base64," + Convert.ToBase64String(imagenW.GetBytes());
               }
           }
           if (Model.IsValid){
             //do something...
           }
           return (View(ivm))
        }

public ActionResult Create( ExampleViewModel ivm ){ if(ivm.Foto ==null){ WebImage imagenW = WebImage.GetImageFromRequest(); if (imagenW != null) { ivm.Foto = "data:image/png;base64," + Convert.ToBase64String(imagenW.GetBytes()); } } if (Model.IsValid){ //do something... } return (View(ivm)) }