我正在做一个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
中的图像为空。
到底是怎么回事?
修改
发生错误的场景如下:
imagenW
在表单中连续第二次出现验证错误时为空。
答案 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))
}