【问题标题】:Scaffold a FileUploader搭建一个 FileUploader
【发布时间】:2017-01-18 16:12:55
【问题描述】:

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

【问题讨论】:

  • 在这种情况下不确定脚手架,但this question 有帮助吗?

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


【解决方案1】:

问题在于您的 HttpPostedFile,如果您使用的是 EditorFor(x => x.myfile),它的作用是检查表达式中指定的属性的类型并尝试为该类型找到匹配的编辑器模板。这个模板告诉 Razor 它应该为模板实现的类型的属性生成什么 HTML。 Razor 有几个可以覆盖的模板,它们在项目中不可见,但 HttpPostedFile 不是其中之一,这就是为什么您可能将 FileName、ContentType 和 ContentLength 视为为该 HttpPostedFile 呈现的接口。

下面是那个类 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)]

然后你可以覆盖上的模板

Views/Shared/EditorTemplates,例如你可以这样做

[DataType(DataType.Upload)]
public HttpPostedFile myfile { get; set; }

然后在 Views/Shared/EditorTemplates/Upload.cshtml 上创建并 Upload.cshtml 使用您要为上传显示的 html。

希望对你有帮助

【讨论】: