Exemple #1
0
        /// <summary>
        /// Execute a modal dialog, and wait for it to close.
        /// </summary>
        public Task <TResult> ExecuteModalTemplateAsync <TModel, TResult>(ModalTemplate <TModel, TResult> template, TModel model, TResult initialResult, CancellationToken cancellationToken = default)
        {
            if (IsModalActive(template))
            {
                throw new Exception("Modal already active");
            }

            var completionSource = new TaskCompletionSource <TResult>();

            var obj = new object();

            var context = new ModalTemplate <TModel, TResult> .ModalContext(model, initialResult, result =>
            {
                //notify modal container
                var modal = ActiveModals.FirstOrDefault(m => m.Template == template);
                ActiveModals.Remove(modal);
                OnModalClose?.Invoke(template, new ModalEventArgs
                {
                    Modal = modal
                });


                if (completionSource.Task.IsCompleted)
                {
                    throw new Exception("Trying to close modal twice!");
                }

                //complete task
                completionSource.SetResult(result);
            }, ModalStateHasChanged, cancellationToken);

            //render fragment;
            var newModal = new ActiveModal()
            {
                Type      = null,
                Template  = template,
                ModalBody = template.ChildContent(context),
            };

            ActiveModals.Add(newModal);

            //notify modal container
            OnModalShow?.Invoke(template, new ModalEventArgs
            {
                Modal = newModal,
            });

            //return task, which completes when the modal closes
            return(completionSource.Task);
        }
Exemple #2
0
 public ActionResult ModalForm(ModalTemplate model)
 {
     return(View(model));
 }