Переадресация запроса с одного контроллера в другой
Делаю простейшею авторизацию - просто по поиску логина и пароля в БД. Если логин и пароль найден, то должна загрузиться страница с объектами принадлежащими данному пользователю.
Для этого создал форму авторизации:
@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 шт):
По ссылке 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(...);
}
В адресной строке ничего лишнего не будет.