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) { //

我正在学习注册模块。流程如下所示:

  • 在数据库中保存数据

  • 通知用户数据已保存

  • 在电子邮件中发送密码

  • 再次更新用户界面。例如,密码已通过电子邮件发送

  • 我想在一个对服务器的UI调用中实现这一点。 步骤1和步骤3已完成。但我不知道如何异步完成步骤2和步骤4

    代码如下:

    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回调。