是否可以创建一个模型,当脚手架创建一个呈现HTML文件上传对象的视图时?
例如,设计一个用于上传图像的模型,该模型将支撑视图以包括图像上传器。
我尝试使用以下属性的模型,但它们呈现为没有上传选项的文本框。
[DataType(DataType.Upload)]
[Display(Name = "Upload a File")]
[Required(ErrorMessage = "Please choose file to upload.")]
public string file { get; set; }
[Display(Name = "Upload File 2")]
[Required(ErrorMessage = "Please choose file to upload.")]
public HttpPostedFile myfile { get; set; }
答案 0 :(得分:0)
问题在于您的HttpPostedFile,如果您使用的是EditorFor(x => x.myfile),它的作用是检查表达式中指定的属性的类型,并尝试查找该类型的匹配编辑器模板。这个模板告诉Razor它应该为模板实现的类型的属性生成什么HTML。 Razor有几个你可以覆盖的模板,它们在项目中不可见,但是HttpPostedFile不是其中之一,这就是为什么你可能会看到FileName,ContentType和ContentLength作为为那个HttpPostedFile呈现的界面。
Bellow是该类HttpPostedFile
的实现public abstract class HttpPostedFileBase {
public virtual int ContentLength {
get {
throw new NotImplementedException();
}
}
public virtual string ContentType {
get {
throw new NotImplementedException();
}
}
public virtual string FileName {
get {
throw new NotImplementedException();
}
}
public virtual Stream InputStream {
get {
throw new NotImplementedException();
}
}
[SuppressMessage("Microsoft.Naming", "CA1702:CompoundWordsShouldBeCasedCorrectly", MessageId = "filename",
Justification = "Matches HttpPostedFile class")]
public virtual void SaveAs(string filename) {
throw new NotImplementedException();
}
}
因为其中一个模板没有默认值,Razor会探索该类并尝试为该类的每个公共属性生成编辑器。
如果在属性上指定DataType
[DataType(DataType.SELECTYOURTYPEHERE)]
然后你可以覆盖
上的模板观看/共享/编辑模板,例如,您可以执行此操作
[DataType(DataType.Upload)]
public HttpPostedFile myfile { get; set; }
然后在 Views / Shared / EditorTemplates / Upload.cshtml上创建和Upload.cshtml 使用您要为上传显示的HTML。
希望这有帮助