gpt4 book ai didi

c# - 获取成功的 Ajax 操作以打开另一个弹出窗口

转载 作者:太空宇宙 更新时间:2023-11-03 14:16:10 24 4
gpt4 key购买 nike

现在我正在尝试让一个 Ajax 窗口在完成时打开另一个窗口。基本上,第一个窗口询问用户是否想做某事,第二个窗口告诉他们成功了。第一个需要是或否,第二个只需要确定。我如何告诉 Ajax Actionlink 在完成后打开另一个?我正在使用 C# 在 MVC 3 中工作。

现在我的 ActionLink 是:

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

这很好用(我知道没有 OnSuccess 位,稍后会提到这个事实)。它可以很好地执行逻辑并重置用户密码。我只是不知道如何让它打开另一个窗口。这是我的 Controller 操作:

    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。我试着把很多不同的东西放在那里但没有结果,所以我 trim 了它们。毕竟,整个问题是我在 OnSuccess = 区域中放了什么?

我对 JQuery 不太了解或不太熟悉,我认为这就是为什么我很难解决这个问题。我已经详尽地搜索并编写了大量不同类型的 JQuery 代码,但无法将它们中的任何一个与 Ajax 链接一起使用。 Controller 操作接受 userName,因为 Admin 执行此操作并且需要为所有用户执行此操作(据说是为了阻止不可避免的情况:“您可以使用 User.Identity.name 语句获取用户的用户名”)。另外,告诉我 trim 异常和 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>

最佳答案

您可以在 OnSuccess 中放置一个 javascript 回调,如果 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);
}
}

为 ModelState 使用一个简单的 DTO:

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;
}
}

如果没有验证错误,success 中的data 参数将为空,否则,它将包含一个验证错误数组,您可以向用户展示这些错误随心所欲。

关于c# - 获取成功的 Ajax 操作以打开另一个弹出窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6538294/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com