Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: MessageBox у клиента ASP .NET  (Прочитано 14231 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« : 14-01-2004 12:09 » 

Есть нарисованный в VS .NET интерфейс пользователя с <asp:button>, клики на которые вызывают методы C# класса на стороне сервера.
Хочется до выполнения метода на стороне сервера спросить через MessageBox вида YesNo про уверенность пользователя в своих действиях. По Yes метод выполнить, а по No нет. Как бы это сделать?

Возможность прикрепить к <asp:button> событие на стороне клиента я что-то не нашёл. Заменил <asp:button> на <input type="button"> - могу вызвать скрипт на стороне клиента, который означенный MessageBox выводит. А как из этого клиентского скрипта вызвать метод класса на стороне сервера? Ведь для этого нужно добыть объект класса, который на клиенте отсутствует.

Или это вообще по-другому делается?

Варианты со страницей вместо MessageBox не предлагать - заказчик MessageBox видеть желает.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #1 : 14-01-2004 12:48 » 

Может кто знает, как механизм посылки сообщений серверу вскрыть? Тогда он сам обработает, посчитав нажатой <asp:button> и не нужно будет вызывать метод напрямую.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
MOPO3
Ай да дэдушка! Вах...
Команда клуба

lt
Offline Offline
Пол: Мужской
Холадна аднака!


WWW
« Ответ #2 : 14-01-2004 13:15 » 

Что то как-то запутанно всё. Ты же на клиента в итоге выводиш ХТМЛ, рисуя его с помощью XML и XSL. Что мешает тебе в XML или XSL запихать JavaScript, который этим и займётся  :?:  Или я неправильно понял что тебе нужно  :?:
Записан

MCP, MCAD, MCTS:Win, MCTS:Web
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 14-01-2004 15:38 » 

 Вот такой я вот
Короче говоря так. На странице есть список ListBox, содержимое которого берётся из DataSet, ассоциированного с базой на SQL Server'е. Есть кнопочки: добавить, обработать, удалить. На "Удалить" должен выскакивать упомянутый MessageBox.

Особенность <asp:button> в том, что её обработчик находится на сервере, и вызов клиентского скрипта туда никак не вклинить. Процедура в виде возврата двух страниц: сперва с вызовом MessageBox на onload, потом без него требует создавать второй метод. По схеме

1. DeleteButton.Click -> Form.DeleteButtonOnClick()
2. Выдаём страницу с MessageBox'ом на <body onload>
3. Затем не знаю как (см. выше) вызвать со страницы метод, производящий собственно удаление.

Долго, и запутано. Или то, что выше описано

1. Через <input type="button" id="DeleteButton" onclick="Call DeleteButtonOnClick"> и собственно вызов MessageBox - всё на стороне клиента
2. пункт 3 из предыдущего - не знаю как.

Я тут нашёл классы Validator'ы. В задачу которых входит проверка полей формы на корректность. Проверка может выполняться и на стороне сервера, и на строне клиента. А у каждого Web Control'а есть свойство CausesValidation. Если его поставить на DeleteButton, то при нажатии будет вызываться скрипт на стороне клиента, вызывающий MessageBox, а результат (валидность) устанавливать в зависимости от ответа Yes или No опять же на стороне клиента. На стороне сервера в методе DeleteButtonOnClick выполняется проверка if(Page.IsValid) { ... собственно удаление ... }.

Однако тут есть непонятность. Если на стороне клиента нет MessageBox'а, то управление передаётся на сервер, на DeleteButtonOnClick, а если есть MessageBox, то метод на сервере вообще не исполняется. Подозрение у меня на проблемы с синхронизацией. MessageBox - дело длительное, может сервер не дожидается результата, потому и игнорирует.  Я шокирован!

Пойду копать дальше.  Быть такого не может
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 14-01-2004 16:13 » 

ВСЁ!  Отлично
Не в синхронизации дело, а в ошибочной константе. Просто, если Validator находится в состоянии невалидности, на сервере вообще ничего не происходит. Таким образом, проверка if(Page.IsValid) избыточна.

Можно подвести итог...

1. На форме aspx - сторона клиента - размещается кнопка, валидатор и скрипт проверки

<html>
   <head>
      <script language="VBScript">
         Sub DelConfirm(source, arguments)
            If MsgBox("Are you sure you want to remove the color?", vbYesNo + vbQuestion, "Confirmation") = vbYes Then
               arguments.IsValid = True
            Else
               arguments.IsValid = False         
            End If
         End Sub
      </script>
   </head>
   <body>
      <form id="Form" method="post" runat="server">
         <asp:button
            id="delButton"
            style="Z-INDEX: 107; LEFT: 345px; POSITION: absolute; TOP: 149px"
            runat="server"
            Text="Delete"
            Width="100px">
         </asp:button>
         <asp:customvalidator
            id="DelValidator"
            style="Z-INDEX: 108; LEFT: 458px; POSITION: absolute; TOP: 151px"
            runat="server"
            ClientValidationFunction="DelConfirm"
            EnableViewState="False"
            Display="None">
         </asp:customvalidator>
      </form>
   </body>
</html>

2. На сервере в cs файле размещается класс формы с обработчиком

using System.Web.UI.WebControls;
...
namespace MyASPApplication
{
   public class WebForm : System.Web.UI.Page
   {
      ...
      protected System.Web.UI.WebControls.Button delButton;
      protected System.Web.UI.WebControls.CustomValidator DelValidator;
      ...
      private void InitializeComponent()
      {    
         ...
         this.delButton.Click += new System.EventHandler(this.delButton_Click);
         ...
      }
      private void delButton_Click(object sender, System.EventArgs e)
      {
         ... собственно удаление ...
      }
   }
}

Все опущенные в Web Control'ах свойства берутся по умолчанию.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 19-01-2004 07:58 » new

Есть и другой способ. Можно создать собственное событие onclick на объект и назначить ему скрипт на стороне клиента. Всякий скрипт может получить аргумент с полем IsValid, установка значения которого в false предотвращает post на сервер.

Этот способ лучше, так как скрипт исполняется на конкретный объект, а объекты потомки BaseValidator исполняются на все объекты, в которых установлено свойство проверки (если нужно делать разные проверки, то с CustomValidator они должны в одной функции выполняться - неудобно).

По данной теме лучше не MSDN читать, а документацию из Framework SDK, устанавливаемую, например, с VS .NET 2002 (7.0).
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines