Форум программистов, компьютерный форум, киберфорум
C#: ASP.NET Core
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.59/29: Рейтинг темы: голосов - 29, средняя оценка - 4.59
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446

Переадресация запроса с одного контроллера в другой

02.04.2021, 09:13. Показов 5536. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Делаю простейшею авторизацию - просто по поиску логина и пароля в БД. Если логин и пароль найден, то должна загрузиться страница с объектами принадлежащими данному пользователю.

Для этого создал форму авторизации:
HTML5
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
32
33
34
35
@model DataCollector.Models.User
@{
    ViewData["Title"] = "Home Page";
}
 
<div class="container">
    <div class="row">
        <div class="col-sm-4"></div>
        <div class="col-sm-4">
            <form class="form-horizontal" asp-action="Index">
                <div class="form-group">
                    <label class="control-label">Имя пользователя</label>
                    <input asp-for="Login" class="form-control" type="text" />
                </div>
                <div class="form-group">
                    <label class="control-label">Пароль</label>
                    <input asp-for="Password" class="form-control" type="password" />
                </div>
                <div class="form-group">
                    <input type="submit" value="Войти" />
                </div>
            </form>
        </div>
        <div class="col-sm-4"></div>
    </div>
</div>
 
@{
    if (TempData["msg"] != null)
    {
        <script>
            alert('@TempData["msg"]')
        </script>
    }
}
Для обработки запроса на авторизацию с данной странице создал контроллер, который, если нашел нужного пользователя должен перенаправлять в контроллер "FriendsController", который должен загрузить список друзей пользователя.
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
32
33
34
public class HomeController : Controller
    {
        private readonly Db_usersContext _context;
 
        public HomeController(Db_usersContext context, ILogger<HomeController> logger)
        {
            _context = context;
        }
 
        public IActionResult Index()
        {
            return View();
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public IActionResult Index([Bind("Login, Password")] User user)
        {
            var db_usersContext = _context.User.Where(u => u.Login.Equals(user.Login) & u.Password.Equals(user.Password));
 
            User userFind = null;
            if (db_usersContext.Count() > 0)
            {
                userFind = db_usersContext.First();
                return RedirectToAction("Index", "FriendsController", new { login = userFind.Login });
            }
            else
            {
                TempData["msg"] = "Данный пользователь был добавлен ранее";
                return NotFound();
            }               
        }
 
    }
При перенаправлении он также должен передать логин пользователя, но как это правильно сделать честно не знаю.

Контроллер в который идет перенаправление:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class FriendsController : Controller
    {
        private readonly Db_usersContext _context;
 
        public FriendsController(Db_usersContext context)
        {
            _context = context;
        }
 
        // GET: Friends
        public async Task<IActionResult> Index(string login)
        {
            var db_usersContext = _context.Friend.Include(f => f.User).Where(f => f.User.Login.Equals(login));
            return View(await db_usersContext.ToListAsync());
        }
}
Это не работает он перенаправляет на страницу "http://localhost:64536/FriendsController?login=vldmr", которая не находится, что логично.

Подскажите как правильно сделать переадресацию?
Как сделать чтобы параметры передавались не в адресной строке (POST)?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.04.2021, 09:13
Ответы с готовыми решениями:

Как выполнить редирект с одного метода контроллера в другой, без пересоздания контроллера
Я делаю в одном из методов RedirectToAction() , в результате чего, перед перенаправлением обновляется текущий контроллер. Как сделать...

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

Переадресация с одного сайта на другой
есть сайт заказчика, ссылки у него левые хочу сделать переадрисацию на свои к примеру старые ссылки ...

14
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
02.04.2021, 09:19
Цитата Сообщение от Volodya_ Посмотреть сообщение
Подскажите как правильно сделать переадресацию?
Почти правильно сделали, только имена контроллеров указываются без суффикса Controller - это convention.
(И правда ведь, зачем указывать, если это всегда контроллеры?)
C#
1
return RedirectToAction("Index", "Friends", new { login = userFind.Login });
2
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446
02.04.2021, 11:44  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Почти правильно сделали, только имена контроллеров указываются без суффикса Controller - это convention.
Спасибо!

Подскажите как сделать, чтобы параметры передавались не в адресной строке, а POST-запросом или другим способом, но чтобы в адресной строке не "святилось"?

А то у меня получается всё наружу, ни какой безопасности ))
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.04.2021, 12:29
Цитата Сообщение от IamRain Посмотреть сообщение
зачем указывать, если это всегда контроллеры?
Чтобы использовать nameof
1
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
02.04.2021, 13:30
Volodya_, вы можете использовать TempData для этого. TempData будет доступен при обработке следующего запроса.

Что касается других способов, отличных от TempData - я тут не смогу быстро дать ответ.
Если кратко, то этот метод возвращает Http code 302 Found и, согласно спецификации, следующий запрос должен сохранять метод запроса (был POST - значит следующий тоже POST + the same body), однако не все браузеры следуют спецификации.
Вроде как чаще всего GET запрос идет.

Отсюда:
is therefore recommended to set the 302 code only as a response for GET or HEAD methods and to use 307 Temporary Redirect instead, as the method change is explicitly prohibited in that case.
Можете возвращать:
C#
1
2
//source: https://stackoverflow.com/questions/1644045/return-307-temporary-redirect-in-asp-net-mvc
return Redirect(url, false, true);  // 307
Добавлено через 16 минут
Цитата Сообщение от IamRain Посмотреть сообщение
Можете возвращать:
Эм, тут я перегнул палку в смысле, что если новые данные сформировались на сервере, и нужно их передать уже в теле запроса при редиректе, то, видимо, только TempData в помощь.

Можно, конечно, на клиенте обработать ситуацию с получением login-а и повторным запросом (данные уже в теле запроса, такое тоже практикуется). Но зачем гонять туда сюда данные, да еще и критичные.
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
02.04.2021, 13:38
Volodya_, мне кажется в типовом шаблоне с поддержкой авторизации пользователей можете посмотреть как там организован редирект при удачном входе.
0
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446
02.04.2021, 13:56  [ТС]
Цитата Сообщение от IamRain Посмотреть сообщение
Эм, тут я перегнул палку в смысле, что если новые данные сформировались на сервере, и нужно их передать уже в теле запроса при редиректе, то, видимо, только TempData в помощь.
TempData это как в моем примере?
C#
1
return RedirectToAction("Index", "Friends", new { login = userFind.Login });
Или как-т по другому?


Цитата Сообщение от IamRain Посмотреть сообщение
Можно, конечно, на клиенте обработать ситуацию с получением login-а и повторным запросом (данные уже в теле запроса, такое тоже практикуется). Но зачем гонять туда сюда данные, да еще и критичные.
Но когда данные получаются по логину передающемуся в открытом виде в строке, это совсем плохо
Можете пример привести о чем вы говорите?
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
02.04.2021, 14:16
Цитата Сообщение от Volodya_ Посмотреть сообщение
Но когда данные получаются по логину передающемуся в открытом виде в строке, это совсем плохо
Вы же этот логин вводите, почему плохо?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
02.04.2021, 14:49
Лучший ответ Сообщение было отмечено Volodya_ как решение

Решение

Цитата Сообщение от Volodya_ Посмотреть сообщение
Или как-т по другому?
C#
1
2
TempData["Login"] = userFind.Login;
return RedirectToAction("Index", "Friends");
И в И Friends/Index уже доставать.
Но я на вашем месте, как уже сказали, посмотрел бы в сторону ASP Identity - там эти вопросы решены из коробки. А то непонятно, почему вы вообще всем этим занимаетесь.
И просмотел бы внимательно, что происходит после успешной аутентификации (в контексте http запрос-ответ) и как извлекается информация из запроса об аутентификации/авторизации пользователя.
Чтобы было понимание, как это работает.
1
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446
02.04.2021, 14:58  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Вы же этот логин вводите, почему плохо?
Кто-то может взять строку и подставить чужой логин и тогда ему выдаст список чужих друзей
0
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
02.04.2021, 15:05
Цитата Сообщение от Volodya_ Посмотреть сообщение
Кто-то может взять строку и подставить чужой логин и тогда ему выдаст список чужих друзей
Ну ваш код сбрутить тоже не составит проблем, так что, вы зря начали писать свой велосипед, Identity очень мощная и хорошая штука.
0
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446
02.04.2021, 15:18  [ТС]
Цитата Сообщение от Почтальон Посмотреть сообщение
Ну ваш код сбрутить тоже не составит проблем, так что, вы зря начали писать свой велосипед, Identity очень мощная и хорошая штука.
Знаю, но я её никогда не использовал и не знаком с ней, а сделать нужно быстро
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,226
02.04.2021, 16:01
Цитата Сообщение от Volodya_ Посмотреть сообщение
а сделать нужно быстро
Бегать быстро можно (иногда) по пешеходному переходу, а не в неположенном месте через дорогу где гоняют со скоростью > 90 км/ч.
Вам какая разница - бегать быстро ногами правильно или бегать быстро на костылях неправильно, с учетом текущих знаний.
Делать надо всегда правильно, а скорость - уже другой вопрос.
1
управление сложностью
 Аватар для Почтальон
1693 / 1306 / 259
Регистрация: 22.03.2015
Сообщений: 7,545
Записей в блоге: 5
03.04.2021, 10:13
Цитата Сообщение от Volodya_ Посмотреть сообщение
а сделать нужно быстро
Внедрить Identity можно без проблем, тем более на метаните есть информация как это сделать. Гонка за скоростью и необдуманность всегда боком выходит.
1
15 / 13 / 3
Регистрация: 20.02.2018
Сообщений: 446
04.04.2021, 14:03  [ТС]
IamRain,
Почтальон,
Уже внедряю ))

Вот ещё на просторах интернета нашел вот такой интересный способ - передать return-ом post-запрос:

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
32
33
34
35
36
37
38
        [HttpPost]
        [AllowAnonymous]
        public async Task<IActionResult> LoginAsync([Bind("UserName", "Password", "ReturnUrl")] LoginViewModel loginViewModel)
        {
            if (!ModelState.IsValid)
            {
                return View(loginViewModel);
            }
 
            var claims = new List<Claim>
            {
                new Claim("Demo","Value")
            };
            var claimIdentity = new ClaimsIdentity(claims, "Cookie");
            var claimPrincipal = new ClaimsPrincipal(claimIdentity);
            await HttpContext.SignInAsync("Cookie", claimPrincipal);
 
           //Перенаправление без параметров в строке с помощью объекта "TempData"
            TempData["UserName"] = loginViewModel.UserName;
            return Redirect(loginViewModel.ReturnUrl);
 
            return Content("<form action='Index' id='postreqwest' method='post'>" +
                "<input type='hidden' name='UserName' value='" + loginViewModel.UserName +
                "' /><input type='hidden' name='Password' value='" + loginViewModel.Password +
                "' /><input type='hidden' name='ReturnUrl' value='" + loginViewModel.ReturnUrl+"'/>" +
                "</form><script>document.getElementById('postreqwest').submit();</script>");
        }
 
        [HttpPost]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Index([Bind("UserName", "Password", "ReturnUrl")] LoginViewModel loginViewModel)
        {
            string userName = loginViewModel.UserName;
 
            var db_usersContext = _context.Friend.Include(f => f.City).Include(f => f.District).Include(f => f.FieldActivity).Include(f => f.PollingStation).Include(f => f.User).
                                    Where(f => f.User.UserName.Equals(userName));
            return View(await db_usersContext.ToListAsync());
        }
Но он просто почему-то возвращает мне мою строку в виде json, а предполагалось, что сформируется post-запрос, который вызовет нужный post-метод - "Index".

Подскажите где тут косяк?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.04.2021, 14:03
Помогаю со студенческими работами здесь

Переадресация с одного сайта на другой
Доброго времени суток уважаемыые форумчани, мне необходимо сделать переадресацию. Чтобы при заходе на мой сайт открывался еще один в новом...

Передача данных из одного контроллера в другой
Приветствую всех. Подскажите, как мне передавать данные от одного микроконтроллера к другому на большое расстояние и без использования...

Передача параметра из одного контроллера в другой
Доброго дня. Есть 2 контроллера. Первый загружает Excel файл на ПК, второй парсит этот файл и выдает таблицу на основании файла. ...

Передача GET параметров из одного контроллера в другой
Всем привет. Может кто подсказать? У меня есть Контроллер #1: В коде ниже, я словил какие-то GET параметры. if...

одного контроллера вывести в другой контроллер
как из одного контролера вывести в другой контролер к контроллер индекс и юзер


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru