...

Razor. Создание кнопки и создание обработчика событий для этой кнопки.

Тема в разделе "Разработчикам", создана пользователем dimich1978, 27 апр 2020.

  1. dimich1978

    dimich1978 Member

    Разработана форма Razor.
    На ней есть несколько кнопок
    для примера
    <button id = "button_search" class = "confirm t-button" >Выбрать</button>
    Далее написана функция

    <!--Функции-->
    @functions
    {
    public string mes()
    {
    string st1 ="Привет";
    return st1;
    }
    }

    После я написал обработчик по клику мышкой по кнопке
    <script>
    $(document).ready(function()
    {
    $('#button_search').click(function()
    {
    alert(@mes);
    });
    </script>

    Простейшая конструкция. Но пока плохо разбираюсь в разоре. Учусь только.
    Т.е. я хотел чтобы по нажатию на кнопке "Выбрать", выходило предупреждение с текстом из функции.
    Как написано выше, никакого сообщения не выходит. Ничего не проиcходит.
    Но как только я заменяю alert(@mes); на alert("Привет"); То сообщение успешно появляется при нажатии по кнопке.
    В чем проблема и как мне можно поступить, чтобы моя конструкция успешно выполнилась. Я понимаю что из скрипта не видится функция из блока @functions. Хорошо. Но как можно поступить?
     
  2. dimich1978

    dimich1978 Member

    Я бы сказал что мне нужно вот что сделать
    Доброго дня всем. Не пойму как определить какой item выбран из выпадающего списка. Чтобы в зависимости от выбора, наложить фильтр на таблицу. (разработка ведется в bpm Elma, поэтому возможны какие то несовпадения, но суть одна). Вырезал код, поэтому мог что-то пропустить , пробел, запятую, скобку закрывающую.
    uses...
    @{

    var EmployeeList = EntityManager<Employee>.Instance.Find("IsDeleted = 0 and NOT Chief is null");
    var Dep_D = EntityManager<Employee>.Instance.Find("NOT Departament is null");
    //в массив добавляю все уникальные отделы
    var massiv = Dep_D.Select(x => x.Departament).Distinct();
    }

    //Добавляю item в выпадающий список
    @foreach(var Dep_Name in massiv)
    {
    listItems.Add(new SelectListItem{Text = Dep_Name.Name, Value =Dep_Name.Id.ToString()});
    }
    //отображаю выпадающий список.
    @Html.DropDownList("Depart_u", @listItems, "Выбор отдела")

    //Цикл в котором выводятся строки
    @foreach(var employee in EmployeeList)
    .....
    @for(int i = 1; i<=CountDay; i++)
    {
    var WeekOfDay = new DateTime(year, month, i).DayOfWeek.ToString();
    var Info = EntityManager<WorkingTime>.Instance.Find("Date = DateTime("+@year + "," + @month+ "," +@i + ") and Employee = " + @employee.Id).FirstOrDefault();
    if(Info == null)
    {
    DateTime dtime = new DateTime(@year,@month,@i);
    Info = @CreateNewInfo(employee,dtime);
    }

    <td bgcolor="#D4E7FD" style = "@GetStyleTd()" ><input type = "text" value="@GetInfo(Info)" text-align:center; style="@GetStyleInput(WeekOfDay,Info)" id = "@Info.Id" class = "@GetClass(Info)"><div style = " margin-top:-6px; position: absolute;"> <a ........ *</a></div></td>
    }
    //завершение цикла вывода строк

    Т.е. код который в цикле, должен выполнятся в зависимости от выбора в выпадающем списке. По идее обернуть надо в функцию или процедуру. Хорошо, но как следить и принимать значения при изменении значения в выпадающем списке. Т.е. по факту мне нужно обернуть в процедуру или функцию. Далее изменить строку. Пока моих познаний не хватает. Помогите как это можно сделать.
    var Info = EntityManager<WorkingTime>.Instance.Find("Date = DateTime("+@year + "," + @month+ "," +@i + ") and Employee = " + @employee.Id +"and Departament ="+@ЗНАЧЕНИЕ ИЗ ВЫПАДАЮЩЕГО СПИСКА ).FirstOrDefault();
    Спасибо , заранее.
     
  3. ahkyamov

    ahkyamov Member

    Тут есть принципиальная проблема, заключается она в том что Razor код выполняется на сервере при формировании страницы, а JS код на клиенте после формирования. Таким образом, без постбэка Razor код все равно не отработает. И я пока не вижу решения вашей задачи с помощью чистого JS. Вообще версия ELMA Community или коммерческая?
     
  4. dimich1978

    dimich1978 Member

    версия коммерческая, но без поддержки уже.
    А если задачу решить следующим способом.
    На форму Разор добавить поле , где предлагается выбор необходимого отдела или отделов(контекстная переменная context.Sel_Department, где Sel_Department - Подразделения). Поместить на форму кнопку. Когда пользователь выбирал отдел, и нажимает кнопку, форма перерисовывается. Как можно переприсвоить переменную context.Sel_Department в перемнную в коде razor формы. Я вижу что к примеру чтобы отобразить тот или иной контрол можно
    так,
    @Html.Caption("Contractor", a => a.Container("div"))
    @Html.EditorOrDisplay("Contractor", a => a.Container("div"))

    А вот как значение из контекстной переменной использовать в коде разор не нашел.
    К примеру у меня есть код в разор форме
    Код:
    @foreach(var employee in EmployeeList)
    {
    <tr>
        <td style = "vertical-align:middle; padding:0px 5px 0px 5px"  valign="middle"> @employee.FullName</td>
    
            @for(int i = 1; i<=CountDay; i++)
            {
                var WeekOfDay = new DateTime(year, month, i).DayOfWeek.ToString();
                var Info =  EntityManager<WorkingTime>.Instance.Find("Date = DateTime("+@year + "," + @month+ "," +@i + ") and Employee = " + @employee.Id).FirstOrDefault();
                if(Info == null)
                {
                    DateTime dtime = new DateTime(@year,@month,@i);
                    Info = @CreateNewInfo(employee,dtime);       
                }
               
                <td bgcolor="#D4E7FD" style = "@GetStyleTd()" ><input type = "text" value="@GetInfo(Info)" text-align:center; style="@GetStyleInput(WeekOfDay,Info)" id = "@Info.Id" class  = "@GetClass(Info)"><div style = "  margin-top:-6px;  position: absolute;"> <a  title="Подробнее"  target="_blank" href="http://bpm.santrek.ru/Common/Catalogs/ViewItem/@Info.Id?uid=3314395a-bae9-4e08-8bc2-4d7632876eb6&back">*</a></div></td>
            }
    </tr>
    }
    и вот в это место var Info = EntityManager<WorkingTime>.Instance.Find("Date = DateTime("+@year + "," + @month+ "," +@i + ") and Employee = " + @employee.Id ).FirstOrDefault();
    добавить +"Departament = "+context..Sel_Department
    Но я так понимаю так не работает. Есть ли способ подтянуть значение контекстной переменной в разор форме?
    Спасибо
     
  5. pushkarev

    pushkarev Active Member

    Вы пытаетесь смешать клиентское выполнение кода и серверное. Так не получится. Для вашей задачи нужно либо разрабатывать свое расширение и web метод, который вызывать из js, либо вообще можно обойтись без Razor, через конструктор форм и поле типа html разметка.
    Можете написать более конкретно, что вы пытаетесь сделать, лучше прямо в терминах пользователя системы.
     
  6. dimich1978

    dimich1978 Member

    Добрый день! Есть таблица(справочник ELMA), хранит данные из СКУД.
    Данные подгружаются в razor форму. В в виде HTML таблицы. Данную таблицу использует отдел кадров. Они могут редактировать её (изменять отработанные часы на основании данных из СКУД) и затем сохраняют. Все бы хорошо(вывод полного списка сотрудников реализовал), если бы не одно НО. Для удобства редактирования, ОК захотели иметь возможность редактировать по отделам. Т.е. выбрали отдел из выпадающего списка, у них отобразились в таблице сотрудники выбранного отдела, они отредактировали данные , сохранили и т.д. И вот тут мне стало не понятно , как это реализовать. Хорошо, список отделов вывел, а вот как фильтровать непонятно. Писать модуль с контроллерами я пока не смогу, не хватит знаний. Да и напоминает больше стрельбу из пушки по воробьям.
     

Поделиться: