Получите успешное действие Ajax, чтобы открыть другое всплывающее окно - PullRequest
2 голосов
/ 30 июня 2011

Прямо сейчас я пытаюсь, чтобы окно 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>

1 Ответ

1 голос
/ 30 июня 2011

Вы можете поместить обратный вызов javascript в OnSuccess, который будет запускаться, если вызов AjaxLink возвращает состояние без ошибок, например:

<script src="../../Scripts/jquery.unobtrusive-ajax.min.js"></script>
<script type="text/javascript">
    function success(data) {
        alert('Your password was reset');
    }
</script>

@Ajax.ActionLink("Reset User Password", "ResetUserPW", "Admin", 
    new { userName = Model.UserName }, 
    new AjaxOptions { Confirm = "Reset Password?", HttpMethod = "HttpPost", OnSuccess = "success" })

Но вам нужен способ вернуть ошибки проверки. Поэтому я бы попробовал что-то вроде этого:

[HttpPost]
 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();
            }
            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("Password", "There is no record of the specified user in the database.");
    }

    if (!ModelState.IsValid)
        return Json(GetModelStateStateErrors(ModelState));

    return Json(null);
}

private IEnumerable<ModelStateError> GetModelStateStateErrors(ModelStateDictionary dictionary) {
    foreach (var key in dictionary.Keys) {
        var error = dictionary[key].Errors.FirstOrDefault();
        if (error != null)
            yield return new ModelStateError(key, error.ErrorMessage);
    }
}

с простым DTO для ModelState:

public class ModelStateError {
    public string Property { get; set; }
    public string Error { get; set; }

    public ModelStateError(string key, string value) {
        this.Property = key;
        this.Error = value;
    }
}

Если ошибок проверки нет, параметр data в success будет иметь значение NULL, в противном случае он будет содержать массив ошибок проверки, которые вы можете представить пользователю по своему усмотрению.

...