添加海报(Primary)和简介(Gallery)图片

需要分别给人员(Person)和影片(Movie)记录添加一张海报和多张简介图片。让我们从迁移类开始:

  1. using FluentMigrator;
  2. namespace MovieTutorial.Migrations.DefaultDB
  3. {
  4. [Migration(20160603205900)]
  5. public class DefaultDB_20160603_205900_PersonMovieImages : Migration
  6. {
  7. public override void Up()
  8. {
  9. Alter.Table("Person").InSchema("mov")
  10. .AddColumn("PrimaryImage").AsString(100).Nullable()
  11. .AddColumn("GalleryImages").AsString(int.MaxValue).Nullable();
  12. Alter.Table("Movie").InSchema("mov")
  13. .AddColumn("PrimaryImage").AsString(100).Nullable()
  14. .AddColumn("GalleryImages").AsString(int.MaxValue).Nullable();
  15. }
  16. public override void Down()
  17. {
  18. }
  19. }
  20. }

然后修改 MovieRow.cs 和 PersonRow.cs:

  1. namespace MovieTutorial.MovieDB.Entities
  2. {
  3. // ...
  4. public sealed class PersonRow : Row, IIdRow, INameRow
  5. {
  6. [DisplayName("Primary Image"), Size(100),
  7. ImageUploadEditor(FilenameFormat = "Person/PrimaryImage/~")]
  8. public string PrimaryImage
  9. {
  10. get { return Fields.PrimaryImage[this]; }
  11. set { Fields.PrimaryImage[this] = value; }
  12. }
  13. [DisplayName("Gallery Images"),
  14. MultipleImageUploadEditor(FilenameFormat = "Person/GalleryImages/~")]
  15. public string GalleryImages
  16. {
  17. get { return Fields.GalleryImages[this]; }
  18. set { Fields.GalleryImages[this] = value; }
  19. }
  20. // ...
  21. public class RowFields : RowFieldsBase
  22. {
  23. // ...
  24. public readonly StringField PrimaryImage;
  25. public readonly StringField GalleryImages;
  26. // ...
  27. }
  28. }
  29. }
  1. namespace MovieTutorial.MovieDB.Entities
  2. {
  3. // ...
  4. public sealed class MovieRow : Row, IIdRow, INameRow
  5. {
  6. [DisplayName("Primary Image"), Size(100),
  7. ImageUploadEditor(FilenameFormat = "Movie/PrimaryImage/~")]
  8. public string PrimaryImage
  9. {
  10. get { return Fields.PrimaryImage[this]; }
  11. set { Fields.PrimaryImage[this] = value; }
  12. }
  13. [DisplayName("Gallery Images"),
  14. MultipleImageUploadEditor(FilenameFormat = "Movie/GalleryImages/~")]
  15. public string GalleryImages
  16. {
  17. get { return Fields.GalleryImages[this]; }
  18. set { Fields.GalleryImages[this] = value; }
  19. }
  20. // ...
  21. public class RowFields : RowFieldsBase
  22. {
  23. // ...
  24. public readonly StringField PrimaryImage;
  25. public readonly StringField GalleryImages;
  26. // ...
  27. }
  28. }
  29. }

我们指定这些字段将由 ImageUploadEditorMultipleImageUploadEditor 类型处理。

FilenameFormat 指定上传文件的命名方式。例如,人员的海报图片将上传到 App_Data/upload/Person/PrimaryImage/ 目录下面。

你可以通过 web.config 文件的 appSettings 节点下的 UploadSettings 配置,把保存上传文件的根目录 (App_Data/upload) 修改为任意文件目录。

~ FilenameFormat 的末尾是自动命名方案的快捷方式 {1:00000}/{0:00000000}_{2}

在这里,参数 {0} 替换为记录的标识,如,PersonID。

参数 {1} 是 1000 以内的整数标识。 这对在一个目录中的保存文件数进行限制是很有帮助的。

参数 {2} 是一个唯一的字符串,例如 6l55nk6v2tiyi,它用于为每个上传文件生成一个新的文件名,这有助于避免客户端缓存所造成的问题。

它还提供了一些安全措施,因此在没有链接的情况下不能知道文件名称。

因此,我们把上传的人员海报图片文件存放在如下路径:

  1. > App_Data\upload\Person\PrimaryImage\00000\00000001_6l55nk6v2tiyi.jpg

你不必遵守此命名方案,也可以指定你自己的格式,如 PersonPrimaryImage_{0}_{2}

下一步,把这些字段添加到表单(MovieForm.cs 和 PersonForm.cs):

  1. namespace MovieTutorial.MovieDB.Forms
  2. {
  3. //...
  4. public class PersonForm
  5. {
  6. public String Firstname { get; set; }
  7. public String Lastname { get; set; }
  8. public String PrimaryImage { get; set; }
  9. public String GalleryImages { get; set; }
  10. public DateTime BirthDate { get; set; }
  11. public String BirthPlace { get; set; }
  12. public Gender Gender { get; set; }
  13. public Int32 Height { get; set; }
  14. }
  15. }
  1. namespace MovieTutorial.MovieDB.Forms
  2. {
  3. //...
  4. public class MovieForm
  5. {
  6. public String Title { get; set; }
  7. [TextAreaEditor(Rows = 3)]
  8. public String Description { get; set; }
  9. [MovieCastEditor]
  10. public List<Entities.MovieCastRow> CastList { get; set; }
  11. public String PrimaryImage { get; set; }
  12. public String GalleryImages { get; set; }
  13. [TextAreaEditor(Rows = 8)]
  14. public String Storyline { get; set; }
  15. public Int32 Year { get; set; }
  16. public DateTime ReleaseDate { get; set; }
  17. public Int32 Runtime { get; set; }
  18. public Int32 GenreId { get; set; }
  19. public MovieKind Kind { get; set; }
  20. }
  21. }

我还修改了人员对话框的 css,让其有更多的空间:

  1. .s-MovieDB-PersonDialog {
  2. > .size { width: 700px; height: 600px; }
  3. .caption { width: 150px; }
  4. .s-PersonMovieGrid > .grid-container { height: 500px; }
  5. }

这就是我们现在的窗体:

Person with Images

ImageUploadEditor 直接在一个字符串字段中存储文件名,而 MultipleImageUpload 编辑器将文件名使用 JSON 数组格式存储在字符串字段中。

删除 Northwind 和 其他 示例

我认为我们的项目达到了良好的状态,现在我要从 MovieTutorial 项目中删除 Northwind 和其他示例。

请参见如下帮助主题:

如何删除 Northwind 和 其他 示例