目前我正在研究一個簡單的 asp.net 應用程式的登錄功能。登錄功能使用 SweetAlert 作為表單收集器,并將 ajax 發送到后端以登錄用戶。登錄功能以某種方式起作用,因為我對其進行了除錯,它進入了成功案例。問題似乎發生在 Success 下的代碼上,它需要使用給定的 url 重定向到操作。這是我的代碼:
前端
function login() {
Swal.fire({
// some sweet alert stuff
}).then((result) => {
if (!result.isConfirmed) return;
var data = {
__RequestVerificationToken: gettoken(),
email: result.value.username,
password: result.value.password,
returnUrl:"@ViewContext.Controller.ValueProvider.GetValue("controller").RawValue.ToString()/@ViewContext.Controller.ValueProvider.GetValue("action").RawValue.ToString()"
}
/* console.log(data)*/
$.ajax({
type: "POST",
url: '/Account/Login',
data: data,
contentType: "application/x-www-form-urlencoded; charset=utf-8",
dataType: "json",
success: function (response) {
console.log(response)
if (!response.success) onFail("Your username or password is incorrect.", login);
},
error: function (response) {
console.log(response)
onFail("Internal error, please try again", login)
}
})
})
}
后端
// POST: /Account/Login
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
if (!ModelState.IsValid)
{
return View(model);
}
var result = await SignInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, shouldLockout: false);
switch (result)
{
case SignInStatus.Success:
string[] parsedUrl = returnUrl.Split('/');
return RedirectToAction(parsedUrl[1], parsedUrl[0]);
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
return Json(new { success = false, html = "", message = "Internal Error" });
default:
ModelState.AddModelError("", "Invalid login attempt.");
return View(model);
}
}
這是回應:
Request URL: https://localhost:44354/Account/Login
Request Method: POST
Status Code: 302
Remote Address: [::1]:44354
Referrer Policy: strict-origin-when-cross-origin
我認為問題發生 return RedirectToAction(parsedUrl[1], parsedUrl[0]);在后端Login()。我嘗試將引數直接設定為returnUrl,但仍然無法正常作業。該網頁不會重定向到任何地方。相反,它會轉到前端 ajax 中的錯誤塊并彈出內部錯誤訊息。
任何建議將不勝感激。
- - - - - - - - - - - - - 編輯 - - - - - - - - - - - - ---------
我找到了狀態302的原因。這是因為我在ajax中指定回應型別為Json,但后端回傳RedirectToAction()。但我仍然需要一些建議。我洗掉dataType: "json",它會回應狀態 500。在這種情況下,我應該如何在登錄后重定向用戶?
uj5u.com熱心網友回復:
看起來您正在使用單個控制器操作來處理 JSON/API 呼叫和常規 HTML 頁面請求:
case SignInStatus.LockedOut:
return View("Lockout");
case SignInStatus.RequiresVerification:
return RedirectToAction("SendCode", new { ReturnUrl = returnUrl, RememberMe = model.RememberMe });
case SignInStatus.Failure:
return Json(new { success = false, html = "", message = "Internal Error" });
常規頁面請求和 API 呼叫的行為不同。
通常來說,一般來說:
- 常規頁面請求需要 HTML 回應,并且會自動遵循重定向。
- API 呼叫需要 JSON 回應并且不遵循重定向。
如果您想從 API 呼叫中獲得重定向行為,則必須手動執行此操作:
- 檢查狀態碼(等于
302) - 從
Location回應頭中提取 url - 使用 JavaScript 將用戶重定向到此 URL:
window.location.href=url
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/422232.html
標籤:
下一篇:方法被呼叫兩次
