/Xpand/Xpand.ExpressApp.Modules/Validation.Web/Controllers/OnErrorAutoScrollPageToTopController.cs

https://bitbucket.org/expand/expand
C# | 94 lines | 83 code | 11 blank | 0 comment | 8 complexity | 1075b3c31e42f4da5bf80909470b0294 MD5 | raw file
  1. using System;
  2. using System.ComponentModel;
  3. using System.Globalization;
  4. using DevExpress.ExpressApp;
  5. using DevExpress.ExpressApp.Actions;
  6. using DevExpress.ExpressApp.Model;
  7. using DevExpress.ExpressApp.Validation;
  8. using DevExpress.ExpressApp.Web;
  9. using DevExpress.Persistent.Validation;
  10. using System.Linq;
  11. namespace Xpand.ExpressApp.Validation.Web.Controllers {
  12. public interface IModelActionsOnErrorAutoScrollPageToTop : IModelNode {
  13. [Category("eXpand")]
  14. [DefaultValue(true)]
  15. bool OnExceptionAutoScrollPageToTop { get; set; }
  16. }
  17. public interface IModelValidationOnErrorAutoScrollPageToTop : IModelNode {
  18. [Category("eXpand")]
  19. [DefaultValue(true)]
  20. bool OnErrorAutoScrollPageToTop { get; set; }
  21. }
  22. [ModelInterfaceImplementor(typeof(IModelValidationOnErrorAutoScrollPageToTop), "Validation")]
  23. public interface IModelDetailViewValidationOnErrorAutoScrollPageToTop : IModelValidationOnErrorAutoScrollPageToTop {
  24. [Browsable(false)]
  25. [ModelValueCalculator("((DevExpress.ExpressApp.Validation.IModelApplicationValidation)Application).Validation")]
  26. IModelValidation Validation { get; }
  27. }
  28. [ModelInterfaceImplementor(typeof(IModelActionsOnErrorAutoScrollPageToTop), "ActionDesign")]
  29. public interface IModelDetailViewOnActionExceptionAutoScrollPageToTop : IModelActionsOnErrorAutoScrollPageToTop {
  30. [Browsable(false)]
  31. [ModelValueCalculator("((DevExpress.ExpressApp.Model.IModelApplication) Application).ActionDesign")]
  32. IModelActionDesign ActionDesign { get; }
  33. }
  34. public class OnErrorAutoScrollPageToTopController : ViewController<DetailView>, IModelExtender {
  35. protected override void OnActivated() {
  36. base.OnActivated();
  37. if (ValidationScrollEnabled()) {
  38. Validator.RuleSet.ValidationCompleted += RuleSetOnValidationCompleted;
  39. }
  40. if (ActionExceptionScroll()) {
  41. foreach (var action in Frame.Controllers.Cast<Controller>().SelectMany(controller => controller.Actions)) {
  42. action.HandleException += ActionOnHandleException;
  43. }
  44. }
  45. }
  46. bool ActionExceptionScroll() {
  47. return ((IModelDetailViewOnActionExceptionAutoScrollPageToTop)View.Model).OnExceptionAutoScrollPageToTop;
  48. }
  49. void ActionOnHandleException(object sender, HandleExceptionEventArgs handleExceptionEventArgs) {
  50. ScrollWindowToTop();
  51. }
  52. protected override void OnDeactivated() {
  53. base.OnDeactivated();
  54. if (ValidationScrollEnabled()) {
  55. if (Validator.RuleSet != null) Validator.RuleSet.ValidationCompleted -= RuleSetOnValidationCompleted;
  56. }
  57. if (ActionExceptionScroll()) {
  58. foreach (var action in Frame.Controllers.Cast<Controller>().SelectMany(controller => controller.Actions)) {
  59. action.HandleException -= ActionOnHandleException;
  60. }
  61. }
  62. }
  63. bool ValidationScrollEnabled() {
  64. return ((IModelDetailViewValidationOnErrorAutoScrollPageToTop)View.Model).OnErrorAutoScrollPageToTop;
  65. }
  66. void RuleSetOnValidationCompleted(object sender, ValidationCompletedEventArgs validationCompletedEventArgs) {
  67. if (validationCompletedEventArgs.Exception != null) {
  68. ScrollWindowToTop();
  69. }
  70. }
  71. void ScrollWindowToTop() {
  72. var scriptKey = DateTime.Now.ToString(CultureInfo.InvariantCulture);
  73. const string script = "window.scrollTo(0, 0);";
  74. WebWindow.CurrentRequestWindow.RegisterClientScript(scriptKey, script);
  75. }
  76. public void ExtendModelInterfaces(ModelInterfaceExtenders extenders) {
  77. extenders.Add<IModelValidation, IModelValidationOnErrorAutoScrollPageToTop>();
  78. extenders.Add<IModelActionDesign, IModelActionsOnErrorAutoScrollPageToTop>();
  79. extenders.Add<IModelDetailView, IModelDetailViewValidationOnErrorAutoScrollPageToTop>();
  80. extenders.Add<IModelDetailView, IModelDetailViewOnActionExceptionAutoScrollPageToTop>();
  81. }
  82. }
  83. }