Прямо сейчас я пытаюсь, чтобы окно Ajax открывало другое окно по завершении.По сути, первое окно спрашивает, хочет ли пользователь что-то сделать, а второе сообщает ему, что оно прошло успешно.Первому нужно «да» или «нет», а второму - «хорошо».Как я могу сказать Ajax Actionlink открыть другой, когда это будет сделано?Я работаю в MVC 3 с C #.
Прямо сейчас мой ActionLink:
@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin",
new { userName = Model.UserName },
new AjaxOptions { Confirm = "Reset Password?", HttpMethod = "HttpGet" })
Это прекрасно работает (я знаю, что нет бита OnSuccess, этот факт упоминается позже).Он прекрасно выполняет логику и сбрасывает пароль пользователя.Я просто не могу понять, как заставить его открыть другое окно.Вот мое действие контроллера:
public ActionResult ResetUserPW(string userName)
{
string newExcept;
MembershipUser user = Membership.GetUser(userName);
if (user != null)
{
try
{
string newPassword = Membership.GeneratePassword(8, 2);
if (user.ChangePassword(user.GetPassword(), newPassword))
{
var mailMessage = new UserMailer();
return PartialView();
//return RedirectToAction("Users"); //Tried this return
result, no go
}
else
{
const string ErroExcept = "There was an error processing your request (the password reset has failed). Please try again.";
ModelState.AddModelError("", ErroExcept);
}
}
catch (Exception ex)
{
newExcept = String.Format("There was an error processing your request({0}). Please try again.", ex.Message);
ModelState.AddModelError("", newExcept);
}
}
else
{
newExcept = "There is no record of the specified user in the database.";
ModelState.AddModelError("", newExcept);
}
return RedirectToAction("Users");
}
Он никогда не доходит до последней строки кода, поскольку выполняется правильно.В верхней части нет тегов данных, хотя я попытался изменить HttpMethod на POST и добавить тег POST.Кроме того, я очень хорошо знаю, что в ActionLink нет OnSuccess или OnCompletion.Я попытался положить туда много разных вещей и не получил результатов, поэтому я обрезал их.И в конце концов, весь вопрос в том, что я должен поместить в область OnSuccess =?
Я не слишком хорош или не знаком с JQuery, и думаю, поэтому мне так трудно это решить.Я тщательно искал и написал тонны различных типов кода JQuery, но не смог использовать ни один из них со ссылкой Ajax.Действие Controller принимает имя пользователя userName, поскольку администратор выполняет это действие и должно будет выполнить его для всех пользователей (говорится, чтобы остановить неизбежное: «Вы можете получить имя пользователя с помощью оператора User.Identity.name»).Кроме того, скажите, было бы полезно обрезать исключения и код ModelState.Заранее спасибо.
Окончательное решение:
public ActionResult ResetUserPW(string userName)
{
string newExcept;
MembershipUser user = Membership.GetUser(userName);
if (user != null)
{
try
{
string newPassword = Membership.GeneratePassword(8, 2);
if (user.ChangePassword(user.GetPassword(), newPassword))
{
var mailMessage = new UserMailer();
mailMessage.AdminPWReset(user.UserName, newPassword, user.Email.SendAsync();
return Json(null);
}
else
{
ModelState.AddModelError("Password", "There was an error processing your request (the password reset has failed). Please try again");
}
}
catch (Exception ex)
{
ModelState.AddModelError("Password", String.Format("There was an error processing your request ({0}). Please try again.", ex.Message));
}
}
else
{
ModelState.AddModelError("Invalid User", "There is no record of the specified user in the database.");
}
if (!ModelState.IsValid)
{
return Json(GetModelStateErrors(ModelState));
}
return Json(null);
}
Глаголов вверху нет.GetModelStateErrors определяется следующим образом:
private IEnumerable<ModelStateError> GetModelStateErrors(ModelStateDictionary dictionary)
{
foreach(var key in dictionary.Keys)
{
var error = dictionary[key].Errors.FirstOrDefault();
if(error != null)
yield return new ModelStateError(key, error.ErrorMessage);
}
}
И, наконец, ссылка Ajax:
@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin",
new { userName = Model.UserName },
new AjaxOptions {
Confirm = "Reset Password?",
HttpMethod = "HttpGet",
OnSuccess="success"
})
Упс, забыл добавить окончательный Javascript, который я использовал.Это так же, как сказал один грамм:
<script type="text/javascript">
function success(data) {
alert('You have successfully reset the user\'s password!');
}
</script>