我可以发誓这应该已经被回答了一百万次,但是在搜索了一段时间之后我已经空了。
我有一个绑定到对象的视图。这个对象应该以某种方式附加一个图像(我没有任何首选方法)。我想验证图像文件。我已经看到了使用属性执行此操作的方法,例如:
public class ValidateFileAttribute : RequiredAttribute
{
public override bool IsValid(object value)
{
var file = value as HttpPostedFileBase;
if (file == null)
{
return false;
}
if (file.ContentLength > 1 * 1024 * 1024)
{
return false;
}
try
{
using (var img = Image.FromStream(file.InputStream))
{
return img.RawFormat.Equals(ImageFormat.Png);
}
}
catch { }
return false;
}
}
但是,这需要模型中属性的HttpPostedFileBase类型:
public class MyViewModel
{
[ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")]
public HttpPostedFileBase File { get; set; }
}
这一切都很好,但我不能在EF Code First模型类中使用这种类型,因为它不适合数据库存储。
那么最好的方法是什么?
答案 0 :(得分:2)
原来这是一个非常简单的解决方案。
public class MyViewModel
{
[NotMapped, ValidateFile(ErrorMessage = "Please select a PNG image smaller than 1MB")]
public HttpPostedFileBase File { get; set; }
}
我设置了NotMapped属性标记,以防止它被保存在数据库中。然后在我的控制器中,我在对象模型中得到了HttpPostedFileBase:
public ActionResult Create(Product product)
{
if (!ModelState.IsValid)
{
return View(product);
}
// Save the file on filesystem and set the filepath in the object to be saved in the DB.
}
答案 1 :(得分:-1)
当我进一步开发网站时,我开始使用ViewModels是不可避免的。为每个视图创建模型绝对是最佳选择。