如何设置级联编辑器(Cascaded Editors)?

你可能需要多级级联的编辑器,如 国家 => 城市、课程 => 班级 =》 科目。

从 Serenity 1.8.2 开始,级联编辑将变得简单。检索编译器(Lookup editors)已经集成了该功能。

在 1.8.2 之前的版本,也可以实现该功能,并且在 Serene 中也有一些示例,但为使它工作,你需要定义一些编辑器类。

假设我们的数据库有三张表:Country、 City、District:

  • Country Table: CountryId, CountryName
  • City Table: CityId, CityName, CountryId
  • District Table: DistrictId, DistrictName, CityId

首先,确保你已经使用 Sergen 为这三张表生成代码,并且都含有 [LookupScript] 特性:

  1. [LookupScript("MyModule.Country")]
  2. public sealed class CountryRow : Row...
  3. {
  4. [DisplayName("Country Id"), Identity]
  5. public Int32? CountryId
  6. {
  7. get { return Fields.CountryId[this]; }
  8. set { Fields.CountryId[this] = value; }
  9. }
  10. [DisplayName("Country Name"), Size(50), NotNull, QuickSearch]
  11. public String CountryName
  12. {
  13. get { return Fields.CountryName[this]; }
  14. set { Fields.CountryName[this] = value; }
  15. }
  16. }
  1. [LookupScript("MyModule.City")]
  2. public sealed class CityRow : Row...
  3. {
  4. [DisplayName("City Id"), Identity]
  5. public Int32? CityId
  6. {
  7. get { return Fields.CityId[this]; }
  8. set { Fields.CityId[this] = value; }
  9. }
  10. [DisplayName("City Name"), Size(50), NotNull, QuickSearch]
  11. public String CityName
  12. {
  13. get { return Fields.CityName[this]; }
  14. set { Fields.CityName[this] = value; }
  15. }
  16. [DisplayName("Country"), ForeignKey("Country", "CountryId"), LookupInclude]
  17. public Int32? CountryId
  18. {
  19. get { return Fields.CountryId[this]; }
  20. set { Fields.CountryId[this] = value; }
  21. }
  22. }
  1. [LookupScript("MyModule.District")]
  2. public sealed class DistrictRow : Row...
  3. {
  4. [DisplayName("District Id"), Identity]
  5. public Int32? DistrictId
  6. {
  7. get { return Fields.DistrictId[this]; }
  8. set { Fields.DistrictId[this] = value; }
  9. }
  10. [DisplayName("District Name"), Size(50), NotNull, QuickSearch]
  11. public String DistrictName
  12. {
  13. get { return Fields.DistrictName[this]; }
  14. set { Fields.DistrictName[this] = value; }
  15. }
  16. [DisplayName("City"), ForeignKey("City", "CityId"), LookupInclude]
  17. public Int32? CityId
  18. {
  19. get { return Fields.CityId[this]; }
  20. set { Fields.CityId[this] = value; }
  21. }
  22. }

请确保在 DistrictRow 的 CityId 字段和 CityRow 的 CountryId 字段添加 LookupInclude 特性。我们在客户端需要它们,否则在默认情况下,它们不包含在检索脚本中。

如果你想在表单(如 CustomerForm)中以级联检索的形式编辑这些字段。你需要把它们设置为:

  1. [FormScript("MyModule.Customer")]
  2. [BasedOnRow(typeof(Entities.CustomerRow))]
  3. public class CustomerForm
  4. {
  5. public String CustomerID { get; set; }
  6. public String CustomeraName { get; set; }
  7. [LookupEditor(typeof(Entities.CountryRow))]
  8. public Int32? CountryId { get; set; }
  9. [LookupEditor(typeof(Entities.CityRow),
  10. CascadeFrom = "CountryId", CascadeField = "CountryId")]
  11. public Int32? CityId { get; set; }
  12. [LookupEditor(typeof(Entities.DistrictRow),
  13. CascadeFrom = "CityId", CascadeField = "CityId")]
  14. public Int32? DistrictId { get; set; }
  15. }

你应该同样在 CustomerRow 中设置这些特性。

在这里,CascadeFrom 特性告诉市(city)编辑器,它将绑定(级联)父编辑器的 ID。

当生成这个表单时,CountryId 字段将被 ID 为 CountryId 的编辑器处理。所以我们将 CityId 检索编辑器的 CascadeFrom 特性设置为该 ID。

CascadeField 决定城市过滤器所在的字段。因此,当国家编辑器的值改变时,城市编辑器的项目也将被 CountryId 过滤,如:

  1. this.Items.Where(x => x.CountryId == CountryEditorValue)

如果 CascadeFromCascadeField 特性是一样的,你只需要指定 CascadeFrom

如果你想在客户网格列表的筛选栏添加这些级联编辑器,则需要在 CustomerGrid.cs 的 CreateToolbarExtensions 方法中执行此操作:

  1. AddEqualityFilter<LookupEditor>("CountryId",
  2. options: new LookupEditorOptions
  3. {
  4. LookupKey = "MyModule.Country"
  5. });
  6. AddEqualityFilter<LookupEditor>("CityId",
  7. options: new LookupEditorOptions
  8. {
  9. LookupKey = "MyModule.City",
  10. CascadeFrom = "CountryId",
  11. CascadeField = "CountryId"
  12. });
  13. AddEqualityFilter<LookupEditor>("DistrictId",
  14. options: new LookupEditorOptions
  15. {
  16. LookupKey = "MyModule.District",
  17. CascadeFrom = "CityId",
  18. CascadeField = "CityId"
  19. });

在这里,我假设在 CustomerRow 有 CountryId、 CityId 和 DistrictId 字段。

现在你的编辑和过滤都有可用的多级编辑器。