Ваше действие должно возвращать данные, а не HTML, потому что вы хотите использовать результат в обратном вызове JavaScript,
Например, вы можете вернуть объект json со свойством uservalidated
, например:
[HttpPost]
public JsonResult Login(User user, string returnUrl)
{
// Validate the email and password
if (users.Login(user.UserName, user.Password, Request.UserHostAddress))
{
FormsAuthentication.SetAuthCookie(user.UserName, true);
// build redirectUrl ...
var redirUrl = ...
return Json(new { uservalidated = true, url = redirUrl });
}
else
{
return Json (new { uservalidated = false, url = null });
}
}
Ваш вызов ajax имеет два обратных вызова. Обратный вызов ошибки только в том случае, если вызов ajax происходит по какой-то причине неправильно.
Независимо от того, предоставил ли пользователь правильные учетные данные или нет, вы всегда вернетесь к своему успешному обратному вызову, потому что сам вызов ajax не должен завершиться ошибкой.
EDIT:
Хорошо, из комментариев я интерполирую, что вы хотите, чтобы ваш метод действия работал с включенным javascript и без него.
У вас есть две возможности:
- Используйте два метода действия - один возвращает JsonResult, другой возвращает ActionResult
- Используйте один метод действия, который автоматически определяет, является ли он запросом ajax или notand, и возвращает полный просмотр / перенаправление или данные JSON при вызове через ajax.
Это пример для последнего:
[HttpPost]
public ActionResult Login(User user, string returnUrl)
{
// do login logic like shown above.
bool userAuthenticated = ...
string redirectUrl = ...
if (Request.IsAjaxRequest()) {
return Json(new { userAuthenticated = userAuthenticated, url = redirectUrl });
}
else {
return Redirect(redirectUrl);
}
}
Последняя часть - как использовать возвращенные данные JSON в вашем коде JavaScript. Вы можете получить к нему доступ в обратном вызове, например:
$.ajax({
...
success: function (data) {
if (data.userAuthenticated) {
window.location.href = data.url;
} else {
// show some fancy invalid credentials message...
}
},
...