ОБНОВЛЕНИЕ: Я удалил все вызовы asyn c и сделал его полностью синхронным, и я все еще испытываю эту проблему, поэтому это не проблема с asyn c.
Итак, у меня есть LoginLayout в моих макетах. Это не основной файл макета. Когда пользователь входит в систему, мы определяем некоторые условные значения в базе данных, а затем перенаправляем их соответственно на промежуточную страницу или непосредственно на нашу панель мониторинга.
Если наш пользователь сначала перенаправляется на промежуточную страницу, и в этом случае они нажмите кнопку отправки, которая отправляет сообщение в действие, и все работает как положено. Но если мы не загружаем промежуточную страницу и вместо этого перенаправляем на другое действие, которое вызывает ту же функцию входа в систему. Они должны go прямо к приборной панели, иначе не возвращать представление, вместо этого возвращать RedirectToAction
, эта же функция нарушает макет приборной панели.
Я действительно вижу, MVC рендерит основной файл _layout ВНУТРИ метода LoginLayout files @RenderBody()
. и URL-адрес не меняется на / Dashboard, что также странно.
Стоит также отметить, что я попытался RedirectToAction
, RedirectToRoute
, Перенаправить все делать то же самое. Кроме того, когда загруженная искаженная страница загружается, если я вручную перехожу к / Dashboard, она корректно отображает.
Вот код
//In my Login controller PostLogin method
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult LogonPost(LoginModel model)
{
//validate login and if all good then
return RedirectToAction("Index", "Intermediary");
}
//Intermediary Controller this one does not work if called page is loaded wierd as described
public async Task<ActionResult> Index()
{
await Task.Run(() =>
{
//grab database stuff in here set session vars etc
});
return await PostLogonConnecting();
}
Этот вызывается как сообщение со страницы, когда они нажимают на кнопка и работает нормально
public async Task<ActionResult> PostCompany(CompaniesListModel model)
{
//do db stuff
return await PostLogonConnecting();
}
Этот PostLogonConnecting находится в моем базовом классе, поэтому его можно вызывать из нескольких контроллеров.
public async Task<RedirectToActionResult> PostLogonConnecting()
{
await Task.Run(() =>
{
//do db stuff in here
});
return RedirectToAction("Index", "Dashboard");
}