C# 我们可以从控制器到视图(ajax mvc)获得多个响应吗?
我正在学习注册模块。流程如下所示:C# 我们可以从控制器到视图(ajax mvc)获得多个响应吗?,c#,ajax,asp.net-mvc,asp.net-mvc-4,C#,Ajax,Asp.net Mvc,Asp.net Mvc 4,我正在学习注册模块。流程如下所示: 在数据库中保存数据 通知用户数据已保存 在电子邮件中发送密码 再次更新用户界面。例如,密码已通过电子邮件发送 我想在一个对服务器的UI调用中实现这一点。 步骤1和步骤3已完成。但我不知道如何异步完成步骤2和步骤4 代码如下: public async Task<JsonResult> CheckUserNameAndInsert(Guid BusinessId, string username, string Email) { //
public async Task<JsonResult> CheckUserNameAndInsert(Guid BusinessId, string username, string Email)
{
// save data in db
LoginViewModel loginViewModel = new LoginViewModel();
loginViewModel.Username = username;
loginViewModel.BuisnessID = BusinessId;
loginViewModel.Email = Email;
ReturnType returnResult = SaveData(loginViewModel);
// send response to notify user that data has been saved.
returnResult.isSent = false;
var obj = JsonConvert.SerializeObject(returnResult);
Response.Write(obj);
Response.Flush();
//Sending password in email
IEmailManagement em = new EmailManagement();
//I am making async call to "em.SendPassword" method.
var task = em.SendPassword(returnResult.Email, returnResult.Password);
var isEmailSend = await task;
returnResult.isSent = isEmailSend;
obj = JsonConvert.SerializeObject(returnResult);
//Notifying user about sent email.
Response.Write(obj);
Response.Flush();
Response.End();
return Json(new { data = returnResult }, JsonRequestBehavior.AllowGet);
}
public异步任务checkUserName和Insert(Guid BusinessId、字符串用户名、字符串电子邮件)
{
//在数据库中保存数据
LoginViewModel LoginViewModel=新LoginViewModel();
loginViewModel.Username=用户名;
loginViewModel.buissid=BusinessId;
loginViewModel.Email=电子邮件;
ReturnType returnResult=保存数据(loginViewModel);
//发送响应以通知用户数据已保存。
returnResult.isSent=false;
var obj=JsonConvert.SerializeObject(返回结果);
响应写入(obj);
Response.Flush();
//在电子邮件中发送密码
IEmailManagement em=新的EmailManagement();
//我正在对“em.SendPassword”方法进行异步调用。
var task=em.SendPassword(returnResult.Email,returnResult.Password);
var isEmailSend=等待任务;
returnResult.isSent=isEmailSend;
obj=JsonConvert.SerializeObject(返回结果);
//通知用户已发送电子邮件。
响应写入(obj);
Response.Flush();
Response.End();
返回Json(新的{data=returnResult},JsonRequestBehavior.AllowGet);
}
完成两项任务后,我只得到一个响应。这不是解决您的方向问题的方法,但这就是我如何构建一些东西来实现这一点: 首先-创建一个包含事务ID、操作和状态列的事件表 用户将与按钮交互以保存数据 页面调用您的控制器,并被分配一个事务ID。这将返回到您的调用页面 在内部,控制器然后调用不同的方法来保存数据,并发送电子邮件。它将分配的事务ID传递给每个方法 当每个方法成功时,它会用事务ID、状态和关联的操作更新事件表 回到调用页面,在事务ID现在在手的情况下,您的页面开始轮询不同的方法,以检查事件表中的给定操作和状态。它可以每秒钟检查一次,每五秒钟检查一次,你有什么 更新事件表时,可以更新页面上的UI,以指示操作已发生 除此功能外,您还可以将事件表用于多种用途。除了添加signalr或Meteor,或者有一个完整的产品来处理排队事件之外,这应该可以帮您完成这项工作
因此,用户只需点击一个按钮,页面就会随着操作的完成而更新。为什么不设置一条消息,说“数据已保存,您应该很快就会收到一封电子邮件”,为什么需要两个通知?非常确定,因为
返回Json(new{Data=returnResult},JsonRequestBehavior.AllowGet)
是唯一被发送回客户端的。你要找的更像是推送通知,比如WebSocket/SignalR。看看这些。@KarthikGanesan我需要知道电子邮件是否已发送。让我们假设电子邮件被卡住,用户将不得不等待响应。@penleychan我知道信号器通知,但我想使用aysnc方法。你运气不好,因为一次呼叫不可能做到这一点。您必须执行多个ajax回调。