Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: ASP.NET MVC
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
Dogarik
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 21
1

Как обратиться к функции в другом контроллере?

23.11.2015, 04:45. Просмотров 930. Ответов 9
Метки нет (Все метки)

Доброго времени суток. У меня в проекте есть несколько контроллеров. В частности AdminController и ReportController.

При написании кода в AdminController мне необходимо обратиться к функции, которая находится в ReportController. Скиньте пример обращения к другому контроллеру, т.к. копировать целиком функцию не хочется, да и думаю, что со стороны "правильного написания кода" это будет не эстетично.

Функция с параметрами называется

LogSave(int rn, int p1, int p2, int rep, int vid, string usr, string komp = "", string prim = "")
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.11.2015, 04:45
Ответы с готовыми решениями:

Регистрация в другом контроллере
Добрый день. Есть у меня стандартная модель People с несколькими полями. И нее есть стандартный...

Можно ли из страницы в одном фрейме обратиться к элементу на странице в другом фрейме?
Имеется фреймсет с двумя фреймами. Можно ли из страницы в одном фрейме обратиться к элементу...

Как обратиться к элементу в другом юните?
Здравствуйте, помогите пожалуйста. Есть два Юнита с динамическими списками. мне нужно их...

Как обратиться к переменной из одного класса в другом?
Я уже видел множество таких обсуждений, но в каждом случае чего-то другое. Не могу решить, как мне...

Как обратиться к функции если
Как обратиться к функции если файл содержащий ее лежит в другой папке?

9
IamRain
1411 / 1257 / 396
Регистрация: 02.08.2011
Сообщений: 3,729
23.11.2015, 05:12 2
Можно сделать редирект на любой метод действия: Controller.RedirectToAction.
В том числе и с параметрами.
0
Dogarik
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 21
23.11.2015, 05:44  [ТС] 3
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        [HttpPost]
        [Authorize(Roles = "Admins")]
        public ActionResult GRAdd(GRComplexData UCD)
        {
            if (ModelState.IsValid)
            {
                Grafik KSP = db.Grafiks.Add(new Grafik()
                {
                    id_p1 = UCD.GRData.id_p1,
                    id_otch = UCD.GRData.id_otch,
                    period = UCD.GRData.period
                });
 
                foreach (Grafik_2 DM in UCD.GR2Data)
                {
                    db.Grafik_2.Add(new Grafik_2()
                    {
                        id_m = UCD.GRData.id,
                        id_p = DM.id_p,
                        data = DM.data,
                        time = DM.time
                    });
                }
 
                db.SaveChanges();
                //LogSave(0, UCD.GRData.id_p1, 0, 99, 1, User.Identity.Name, HttpContext.Request.UserHostAddress);
                return RedirectToAction("GRList", new { raion = UCD.GRData.id_otch, year = UCD.GRData.id_p1 });
            }
            UCD.Sel = new mainGUselector() { id = 0, year = UCD.GRData.id_p1 };
            return View(UCD);
        }
Вот пример кода. Мне необходимо использовать функцию LogSave. Если я вставляю RedirectToAction, то последний редирект у меня выпадает в ошибку, а он мне нужен, он отправляет после выполнения на нужную страницу.

Или я что-то не так делаю?
0
IamRain
1411 / 1257 / 396
Регистрация: 02.08.2011
Сообщений: 3,729
23.11.2015, 05:59 4
Цитата Сообщение от Dogarik Посмотреть сообщение
Мне необходимо использовать функцию LogSave
Ее разве нельзя просто вызвать в методе контроллера? (раскомментировать)

Цитата Сообщение от Dogarik Посмотреть сообщение
Или я что-то не так делаю?
Видимо, да. Если вам нужен логгер, то создайте отдельный класс для этого и передавайте в конструктор всех контроллеров, для которых необходимо логирование.

Можно заморочиться и разобраться с уже разработанными системами логирования: NLOG

Создавать же экземплярный (да и статический) метод в классе контроллера - в корне неверно с точки зрения ООП. Контроллер не обязан ничего логировать.
0
Dogarik
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 21
23.11.2015, 06:24  [ТС] 5
Дело в том, что разработку и внедрение начинал другой специалист.
Велось это все достаточно долгое время и очень часто эта функция появляется в коде. Исправлять (или переделывать полностью) не удобно очень затратно по времени.
Как понимаю другой возможности обратиться к функции нет?
0
IamRain
1411 / 1257 / 396
Регистрация: 02.08.2011
Сообщений: 3,729
23.11.2015, 06:30 6
Цитата Сообщение от Dogarik Посмотреть сообщение
Как понимаю другой возможности обратиться к функции нет?
Ну, почему, если качество кода для вас не важно, можно создать экземпляр контроллера явно и вызвать его метод LogSave. - Но это полный бред.

Попробуйте лучше отрефакторить. - Это не должно занять уж очень много времени, учитывая возможности IDE и ее плагинов.
0
Dogarik
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 21
23.11.2015, 06:39  [ТС] 7
Цитата Сообщение от IamRain Посмотреть сообщение
Попробуйте лучше отрефакторить
А можно как нить "на пальцах" объяснить как это сделать? Только по возможности с учетом начального уровня знания MVC
Или может пример кода будет?
0
IamRain
1411 / 1257 / 396
Регистрация: 02.08.2011
Сообщений: 3,729
23.11.2015, 06:48 8
Цитата Сообщение от Dogarik Посмотреть сообщение
функции, которая находится в ReportController
1.Выделяете методы логирования, которые у вас в ReportController и оформляете как отдельную сущность-логгер. Можно даже интерфейс выделить.
2.Во всех контроллерах, где необходимо логирование, объявляете поле типа логгера и инициализируете в конструкторе.
3. В ReportController можно воспользоваться функцией VS "Найти-Заменить" и поменять LogSave на myObject.LogSave. Как-то так. А параметры ручками воткнете.
Можно покопаться в решарпере, если установлен, скорее всего легче способ можно найти. - Не так много приходилось рефакторить.
0
Metall_Version
2122 / 1259 / 516
Регистрация: 04.03.2014
Сообщений: 4,092
Завершенные тесты: 2
23.11.2015, 10:01 9
Dogarik, если требуется в двух контроллерах вызвать один метод, то может стоит подумать чтобы сделать базовый класс, в котором будет этот метод, и тогда можно в любом контроллере наследнике вызывать этот метод.

Если это именно метод хелпер с дополнительным функционалом, который возвращает данные или модель то так и нужно сделать (и не забыть пометить этот метод атрибутом ChildActionOnly или NoAction, и лучше сделать его protected), но если это метод именно экшн, то есть может вызываться отдельно и возвращает ActionResult(view) - то лучше оставить его в одном из двух контроллеров, и делать RedirectToAction на него.
0
Dogarik
0 / 0 / 0
Регистрация: 21.04.2015
Сообщений: 21
08.12.2015, 04:52  [ТС] 10
Я плохо знаю теорию в этом направлении программирования. По работе только недавно столкнулся с этим. Поэтому не всегда понимаю о чем идет речь (извините конечно )

Не могли бы мне подсказать по нагляднее, как правильно решить мою проблему?

Описание:

В определенных местах кода встречается обращение к функции LogSave

C#
1
public void LogSave(int rn, int p1, int p2, int rep, int vid, string usr, string komp = "", string prim = "")
rn - номер района;
p1 - год;
p2 - период;
rep - номер отчета;
vid - вид действия;
usr - пользователь;
komp - ip-адрес компьютера;
prim - примечание.

Сама функция прописана в ReportController и имеет вид:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void LogSave(int rn, int p1, int p2, int rep, int vid, string usr, string komp = "", string prim = "")
        {
            db.LogTables.Add(new LogTable()
            {
                id_rn = rn,
                id_p1 = p1,
                id_p2 = p2,
                rep = rep,
                usr = usr,
                vid = vid,
                date = DateTime.Now,
                ipadr = komp,
                prim = prim
            });
            db.SaveChanges();
        }

Но вот появилась необходимость обратиться в этой функции из AdminController. Тут возникла проблема!

Dogarik, если требуется в двух контроллерах вызвать один метод, то может стоит подумать чтобы сделать базовый класс, в котором будет этот метод, и тогда можно в любом контроллере наследнике вызывать этот метод.
Как правильно это сделать?
0
08.12.2015, 04:52
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
08.12.2015, 04:52

Как обратиться к указатели в функции?
Всем добрый день. Имеются структуры в структурах: typedef struct { DWORD dwLinkNum; ...

Как обратиться к функции из другого файла
Добрый день. Как можно обратиться к функции из другого файла php ТоЛЬКО не используя функции...

Как обратиться к функции, расположенной в DataModule?
Очень часто в разных формах встречается одна и та же функция, имеющая довольно объемный код....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru