【问题标题】:How to return message from MVC controller to AngularJS controller如何从 MVC 控制器向 AngularJS 控制器返回消息
【发布时间】:2020-08-28 20:26:51
【问题描述】:

我需要向用户添加一条警告消息,因此如果他们尝试插入会议 ID == 0 的记录,则会返回一条消息让他们知道。

我当前保存数据的 AngularJS 代码,在 C# 中调用 ImportData 方法

// Save data to sql database  
$scope.SaveData = function (excelData) {
    $http({
        method: "POST",
        url: "/Home/ImportData",
        data: JSON.stringify(excelData),
        headers: {
            'Content-Type': 'application/json'
        }
    }).then(function (data) {
        if (data.status) {
            $scope.Message = excelData.length + " Record Successfully Inserted";
            $scope.GetData();
        }
        else {
            $scope.Message = "Failed";
        }
    }, function (error) {
        $scope.Message = "Error";
    });
};

C#代码:

 [HttpPost]
 public ActionResult ImportData (List<Meeting_WIP> meeting) {
     bool status = false;
     try {
         if (ModelState.IsValid) {
             using (MeetingEntities db = new MeetingEntities ()) {
                 foreach (var i in meeting) {
                     if (i.MeetingID == 0) {
                         throw new ArgumentException ("Meeting ID cannot be null or empty string", i.MeetingID.ToString ());
                     } else {
                         var compositeKey = db.Meeting_WIP.Find (i.MeetingID, i.AgendaItem);

                         if (compositeKey == null) {
                             // Meeting ID does not exist in database it is a new one 
                             db.Meeting_WIP.Add (i);
                         } else {
                             // Meeting ID already exist in database just update record
                             db.Entry (compositeKey).CurrentValues.SetValues (i.MeetingID);
                             db.Entry (compositeKey).State = EntityState.Modified;
                         }
                     }
                 }

                 db.SaveChanges ();
                 status = true;
             }
         }
     } catch (Exception ex) {
         ExceptionLogging.SendErrorToText (ex);
     }
     return new JsonResult { Data = new { status = status } };
 }

目前即使 excel 数据文件包含会议 ID == 0,显示的消息是:

$scope.Message = excelData.length + " Record Successfully Inserted";

当会议 ID == 0 时如何告诉 Angular 代码,然后返回错误并显示如下内容:

"Meeting ID cannot be zero/null"

angularjs代码调试截图

【问题讨论】:

    标签: javascript angularjs asp.net-mvc error-handling


    【解决方案1】:

    由于您在会议 ID 为零时抛出参数异常,您应该捕获该异常并相应地设置状态和验证消息。

    [HttpPost]
      public ActionResult ImportData (List<Meeting_WIP> meeting) {
          bool status = false;
          string message = "";
    
          try {
              if (ModelState.IsValid)
    
              {
    
                  using (MeetingEntities db = new MeetingEntities ())
    
                  {
    
                      foreach (var i in meeting)
    
                      {
    
                          if (i.MeetingID == 0)
    
                          {
                              throw new ArgumentException ("Meeting ID cannot be null or empty string", i.MeetingID.ToString ());
                          } else
    
                          {
    
                              var compositeKey = db.Meeting_WIP.Find (i.MeetingID, i.AgendaItem);
    
                              if (compositeKey == null)
    
                              {
                                  // Meeting ID does not exist in database it is a new one 
                                  db.Meeting_WIP.Add (i);
                              } else
    
                              {
                                  // Meeting ID already exist in database just update record
                                  db.Entry (compositeKey).CurrentValues.SetValues (i.MeetingID);
                                  db.Entry (compositeKey).State = EntityState.Modified;
                              }
    
                          }
    
                      }
    
                      db.SaveChanges ();
                      status = true;
                  }
              }
          } catch (Exception ex) {
              ExceptionLogging.SendErrorToText (ex);
          } catch (System.ArgumentException ae) {
              status = false;
              message = "Meeting ID cannot be zero/null";
          }
          return new JsonResult { Data = new { status = status, message = message } };
      }
    

    您可以为验证消息的 json 结果添加新属性并将值设置为“会议 ID 不能为零/空”

    if (data.data.status == true) {
        $scope.Message = excelData.length + " Record Successfully Inserted";
        $scope.GetData();
    }
    else {
        $scope.Message = data.data.message;
    }
    

    【讨论】:

    • 我知道我不擅长这个,我在不断学习。您能告诉我如何在我的代码中实现这一点吗?
    • @erasmocarlos 更新了我的答案,希望这会有所帮助,继续努力:)
    • 感谢您的帮助。我要试试你的解决方案。尚不清楚的一件事是,我将如何在 angularJS/JavaScript 代码中检查此消息?
    • @erasmocarlos 类似于您检查 data.status 的方式,data.message 将包含您的消息。
    • 我一头雾水,我看到data.status = false,而data.message = "会议ID不能为零/空",这部分:if (data.status) { $scope. Message = excelData.length + "记录插入成功"; $scope.GetData(); } - 我继续得到:$scope.Message = excelData.length + "Record Successfully Inserted";显示在我的消息模式窗口上。我知道我错过了更改,我将在哪里添加检查状态 == false 并显示错误消息?感谢您的帮助和耐心。