脚手架FileUploader

时间:2017-01-18 16:12:55

标签: c# asp.net asp.net-mvc visual-studio file-upload

是否可以创建一个模型,当脚手架创建一个呈现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; }

1 个答案:

答案 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。

希望这有帮助