EPR类企业管理系统

在我们现有系统基础上或全新开发,提供定制服务
为您的企业高效快速实施ERP,WMS,MES,CRM管理系统
全面管控物料仓库、销售业务、采购业务、仓库业务
生产过程、质量检验、组织架构、业务报表


定制
QQ:460-3528

开发
QQ群:3360-90194

源码
微信:136-3650-3721

定制控制器和按钮

要在eXpressApp框架中实现新功能,请创建一个新的Controller。如果功能需要最终用户交互,请向其添加操作。同时,您可能需要自定义eXpressApp框架或第三方提供的Controller或Action 。大多数内置控制器都会公开事件,您可以处理这些事件以添加自定义代码。另一种方法是从现有Controller继承并覆盖其虚拟方法。在某些情况下,处理控制器事件或操作事件更容易,更有效。在本主题中,我们将详细介绍每种情况下自定义提供的功能更合适的情况。

访问控制器的事件和属性

如果需要对动作的行为或控制器的行为进行其他几个独立的自定义,则这种自定义特定功能的方法更合适。例如,两个模块声明了通过“新建操作”创建时需要额外初始化的业务对象。在这种情况下,这两个模块都应独立扩展“操作”行为。在这种情况下,处理事件比从Controller继承更合适。

注意

在特定情况下,您可能需要处理一系列事件,而不是单个事件。

您可以使用Frame.GetController <ControllerType>方法从自定义Controller访问任何内置Controller

以下代码演示了如何从“操作”的项目列表中删除“个人”项目,以禁止最终用户创建“个人”对象。为此,将创建一个新的控制器。在其OnActivated方法中,可以访问NewObjectViewController来订阅其NewObjectViewController.CollectDescendantTypes事件。生成“操作”的项目列表时会触发此事件。在CollectDescendantTypes事件处理程序中,“个人”项已从此列表中删除。该OnDectivated方法退订的CollectDescendantTypes事件。

using DevExpress.ExpressApp.SystemModule;
using DevExpress.Persistent.BaseImpl;
// ...
public class CustomizeNewActionWindowController : ViewController {
    protected override void OnActivated(){
        base.OnActivated();
        NewObjectViewController controller = Frame.GetController<NewObjectViewController>();
        if (controller != null) {
            controller.CollectDescendantTypes  = NewObjectViewController_CollectDescendantTypes;
        }
    }
    private void NewObjectViewController_CollectDescendantTypes(
        object sender, CollectTypesEventArgs e) {
        foreach (Type type in e.Types) {
            if (type.Name == nameof(Person)) { e.Types.Remove(type); break; }
        }
    }
    protected override void OnDeactivated() {
        NewObjectViewController controller = Frame.GetController<NewObjectViewController>();
        if (controller != null) {
            controller.CollectDescendantTypes -= NewObjectViewController_CollectDescendantTypes;
        }
        base.OnDeactivated();
    }
}
重点

为了避免从代码访问现有Controller时可能出现的空引用异常,请始终确保XafApplication.OptimizedControllersCreation属性为true时,Frame.GetController <ControllerType>方法的结果不为null

从控制器继承

在构建XAF应用程序时,您可能会面临以下任务:控制器提供了有用的功能,但是您需要对其进行一些自定义。此定制不依赖任何条件,因此您无需在另一个模块中修改定制。在这种情况下,最好的技术是从所需的Controller继承并覆盖其虚拟方法。您可能还需要自定义特定的操作。在这种情况下,由于Actions包含在Controller中,因此您还需要从Action的Controller继承并覆盖其虚拟方法。

所有没有后代的Controller都会实例化为Frame。另外,由于后代控制器继承了基本控制器的操作,因此在XAF中可能同时使用的模块中创建一个控制器的多个后代通常没有任何意义。应用。在这种情况下,所有这些后代都将被实例化,并且将有几个基本Controller的Actions副本。这种情况导致异常,因为操作必须具有唯一的ID。因此,最好仅创建基本Controller的一个后代并在其中执行所有自定义。但是,如果需要,您可以有多个后代控制器,但是在这种情况下,您将需要在控制器的代码中手动禁用继承的动作。

重点
  • 创建后代时,请特别注意选择适当的内置Controller类型。在大多数情况下,创建内置Controller的后代需要选择继承链中的最后一个后代。例如,如果一个控制器具有WinForms,ASP.NET或特定于移动设备的后代(例如ModificationsController类的WinModificationsControllerWebModificationsControllerMobileModificationsController后代),则必须创建其后代而不是父类的后代。否则,将同时激活内置控制器和您的后代,并且将显示重复的操作,如上所述。

    但是,请记住ViewControllerWindowController是基本控制器。它们不提供任何特定功能,而是为开发新控制器而设计的。因此,您可以从这些父Controller继承来在特定于UI的模块项目中创建新Controller。您新实现的项将不会与ViewControllerWindowController的子级中的任何其他项冲突。

  • 继承内置Controller时,请勿更改ViewController.TargetObjectTypeViewController.TargetViewTypeViewController.TargetViewIdViewController.TargetViewNesting属性值。否则,您将在与这些属性指定的条件不匹配的其他视图中失去继承的Controller的功能。

从控制器继承时,应用程序模型将包含有关基础控制器和继承的控制器的信息。在ActionDesign中| Controllers节点,新的Controller将包含在其中声明的Actions。继承的动作将显示在基本Controller的节点下。

作为此定制类型的示例,请考虑WebModificationsController控制器。它包含以下操作:取消保存保存并关闭和编辑。每个Action都有一个虚拟方法:CancelSaveSaveAndCloseExecuteEdit。当最终用户使用操作执行特定操作时,将调用此方法。因此,要自定义默认执行过程,可以从WebModificationsController控制器继承并覆盖这些虚拟方法中的任何一个。在这种情况下,所有用户界面设置(类别标题图片快捷方式工具提示等)以及操作的管理状态(有效和已启用)。

默认情况下,在ASP.NET应用程序中执行SaveAndClose Action后,将以视图模式显示详细视图。在下面的代码中演示了Controller的情况下,执行此Action后将关闭事件详细信息视图。

using DevExpress.ExpressApp.Web.SystemModule;
// ...
public class MyWebModificationsController : WebModificationsController
{
   protected override void SaveAndClose(SimpleActionExecuteEventArgs e) {
      View view = View;
      base.SaveAndClose(e);
      if ((view != null) && (view.ObjectTypeInfo.Type == typeof(Incident))) {
            view.Close();
      }
   }
}

在此示例中,通过单个方法自定义动作行为。但是,“控制器和操作”可能更复杂,因此,您可能需要覆盖多个虚拟方法。

相关文章

转载保留此链接,注明出处