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

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

Для этого создал форму авторизации:

@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", который должен загрузить список друзей пользователя.

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();
        }               
    }
}

При перенаправлении он также должен передать логин пользователя, но как это правильно сделать честно не знаю.

Контроллер в который идет перенаправление:

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", которая не находится.

Подскажите, как правильно сделать переадресацию?


Ошибка найдена - не верное имя контроллера, нужно так:

return RedirectToAction("Index", "Friends", new { login = userFind.Login });

Если возможно, чтобы параметры передавались не в адресной строке (POST)?

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


Ответы (1 шт):

Автор решения: Alexander Petrov

По ссылке https://stackoverflow.com/q/129335/5045688 есть несколько ответов.

Например, можно использовать следующий способ.

HomeController:

TempData["login"] = userFind.Login;
return RedirectToAction("Index", "Friends"); // без параметра

FriendsController:

public IActionResult Index() // без параметра
{
    string login = (string)TempData["login"]; // извлекаем логин
    // ...
    return View(...);
}

В адресной строке ничего лишнего не будет.

→ Ссылка