title: Show errors from Controller to a Boostrap Alert
body: <p>I am looking for a way to add an error message to show errors. Currently I have this in my Controller to handle errors:</p>
  
  <pre><code>public partial class SongsManagementController : BaseController
  {
  
      private const string NoDataFound = "No data found.";
      private const string InvalidDataPosted = "Invalid data posted";
      private const string InvalidRequest = "Invalid request.";
      private const string VerificationFailedUnexpectedError = "The following song failed to verify due to an unexpected error, please contact RightsApp support.";
      private const string ConcurrencyError = "The following song failed to verify as another user has since changed its details.";
  
      [HttpPost]
      [Route("VerifyNewSongs")]
      [AuthorizeTenancy(Roles = "super,administrator")]
      public async Task&lt;ActionResult&gt; VerifyNewSongs(List&lt;VerifySongViewModel&gt; verifySongViewModels)
      {
          // Not AJAX method - refuse
          if (!Request.IsAjaxRequest())
              return RedirectToAction("NewSongs", "SongsManagement");
  
          if (verifySongViewModels.NullOrEmpty())
          {
              // return error;
              return Json(new JsonBaseModel
              {
                  success = false,
                  message = InvalidRequest,
                  data = null,
                  errors = new List&lt;string&gt;
                  {
                      InvalidDataPosted
                  }
              });
          }
          foreach (var verifySong in verifySongViewModels)
          {
              if (verifySong.WorkId == default(Guid) || verifySong.RowVersion == default(Guid))
              {
                  return Json(new JsonBaseModel
                  {
                      success = false,
                      message = InvalidDataPosted,
                      data = null,
                      errors = new List&lt;string&gt;
                      {
                          $"Invalid data posted for following song.",
                          $"Song Title: {verifySong.SongTitle}",
                          $"Song Id: {verifySong.UniqueCode}"
                      }
                  });
              }
              var work = await _artistAccountService.GetWorkGraphAsync(verifySong.WorkId, includeWriterAmendments: true);
              if (work == default(WorkGraphModels.Work))
              {
                  return Json(new JsonBaseModel
                  {
                      success = false,
                      message = NoDataFound,
                      data = null,
                      errors = new List&lt;string&gt;
                      {
                          $"No data found for following song.",
                          $"Song Title: {verifySong.SongTitle}",
                          $"Song Id: {verifySong.UniqueCode}"
                      }
                  });
              }
              if (work.VerifiedState != Domain.Enumerators.VerifiedStateType.NotVerified)
              {
                  return Json(new JsonBaseModel
                  {
                      success = false,
                      message = NoDataFound,
                      data = null,
                      errors = new List&lt;string&gt;
                      {
                          $"Song already verified.",
                          $"Song Title: {verifySong.SongTitle}",
                          $"Song Id: {verifySong.UniqueCode}"
                      }
                  });
              }
              work.RowVersion = verifySong.RowVersion;
              var workAndAmendment = new WorkGraphModels.WorkAndAmendment
              {
                  Original = work,
                  Amendment = null
              };
              var verifiedState = await _artistAccountService.VerifyWorkGraphAsync(workAndAmendment, GetLoggedUserId());
              if (!verifiedState.ValidationErrors.NullOrEmpty())
              {
                  return Json(new JsonBaseModel
                  {
                      success = false,
                      message = NoDataFound,
                      data = null,
                      errors = new List&lt;string&gt;
                          {
                              VerificationFailedUnexpectedError,
                              $"Song Title: {verifySong.SongTitle}",
                              $"Song Id: {verifySong.UniqueCode}"
                          }
                  });
              }
              else if (!verifiedState.DatabaseErrors.NullOrEmpty())
              {
                  if (!verifiedState.FatalException)
                  {
                      // concurrency exception                        
                      return Json(new JsonBaseModel
                      {
                          success = false,
                          message = NoDataFound,
                          data = null,
                          errors = new List&lt;string&gt;
                          {
                              ConcurrencyError,
                              $"Song Title: {verifySong.SongTitle}",
                              $"Song Id: {verifySong.UniqueCode}"
                          }
                      });
                  }
                  else
                  {
                      // fatal
                      return Json(new JsonBaseModel
                      {
                          success = false,
                          data = null,
                          errors = new List&lt;string&gt;
                          {
                              VerificationFailedUnexpectedError,
                              $"Song Title: {verifySong.SongTitle}",
                              $"Song Id: {verifySong.UniqueCode}"
                          }
                      });
                  }
              }
          }
          return Json(new JsonBaseModel
          {
              success = true,
              message = "All songs verified successfully."
          });
      }
  };
  </code></pre>
  
  <p>}</p>
  
  <p>This is my Main View:</p>
  
  <pre><code>Layout = Request.IsAjaxRequest() ? null : "~/Views/Shared/_SentricLayout.cshtml";
      var actionName = ViewContext.RouteData.Values["Action"].ToString();
  
      @* calc full account code *@
      var fullAccountCode = Model.WorkUniqueCode;
      ViewBag.Title = "New Songs";
  }
  
  @section scripts {
      @Scripts.Render("~/bundles/jqueryajaxval")
      @Scripts.Render("~/bundles/jqueryval")
      @Scripts.Render("~/bundles/datetimepicker")
      &lt;script language="javascript" type="text/javascript"&gt;
      @* DOM ready? *@
      $(function () {
          addTableStylingScripts();
          var selectFormDiv = $('.catalogSelector');
          selectFormDiv.hide();
  
          $(".records-selected").hide();
  
          // clear all filter boxes and reset search.
          $("#btnClear").click(function()
          {
              $("#newSongsSearch").find(':input').each(function ()
              {
                  if (this.type === "text")
                  {
                      $(this).val("");
                  }
              });
  
              $("#btnSearch").click();
          });
  
          @* edit catalogue button *@
          $('#changeCat').click(function () {
              $('#errorContainer').hide();
  
              var label = $('#catLabel');
  
              if (label.is(":visible")) {
                  label.hide();
                  selectFormDiv.show();
  
                  $('#changeCat').addClass("active");
              } else {
                  label.show();
                  selectFormDiv.hide();
  
                  $('#changeCat').removeClass("active");
              }
          });
  
          @* edit dropdown *@
          $("#catalogueSelect").on("change", function () {
              @* change display on select change *@
              $('#errorContainer').hide();
              $('#catLabel').show();
              selectFormDiv.hide();
              $('#changeCat').removeClass("active");
  
              @* set up ajax post to controller *@
              var model = {
                  AccountCode: '@fullAccountCode',
                  CurrentAccountId: $('#currentAccountId').val(),
                  CurrentRowVersion: $('#currentRowVersion').val(),
                  NewCatalogueId: $('#catalogueSelect option:selected').val(),
                  Action: '@actionName'
              };
              $.ajax({
                  url: '@Url.Action("ChangeCatalogue", "ArtistAccount")',
                  data: JSON.stringify(model),
                  type: 'POST',
                  cache: false,
                  contentType: 'application/json',
                  success: function (result) {
                      @* ajax worked *@
                      if (result.ChangeStatus === "Success")
                      {
                          var newSelected = $('#catalogueSelect option:selected').text();
                          $('#catLabel').html(newSelected);
  
                          @* update dropdown context *@
                          var newSelectedId = $('#catalogueSelect option:selected').val();
                          $('#currentCatalogue').val(newSelectedId);
  
                          @* update rowversion *@
                          var newRowVersion = result.OldOrNewRowVersion;
                          $('#currentRowVersion').val(newRowVersion);
                      }
                      else
                      {
                          $('#errorContainer').show();
                          $('#errorMessage').html(result.ErrorMessage);
  
                          @* return downdown context *@
                          var currentCatId = $('#currentCatalogue').val();
                          $("#catalogueSelect").val(currentCatId);
                          $('#catalogueSelect').select2({ width: '180px', dropdownAutoWidth: true });
                      }
                  },
                  error: function () {
                      @* failed *@
                      $('#errorContainer').show();
                      $('#errorMessage').html('There was a server error, please contact the support desk on (+44) 0207 099 5991.');
  
                      @* return downdown context *@
                      var currentCatId = $('#currentCatalogue').val();
                      $("#catalogueSelect").val(currentCatId);
                      $('#catalogueSelect').select2({ width: '180px', dropdownAutoWidth: true });
                  }
              });
          });
  
          function loadPartialPage(url) {
              $('.spinnerOverlay').removeClass('hide');
              $.ajax({
                  url: url,
                  type: 'GET',
                  cache: false,
                  success: function (result) {
                      $('.spinnerOverlay').addClass('hide');
                      $('#tableContainer').html(result);
                      addBootstrapTooltips("#tableContainer");
                  }
              });
          }
          function getSelectedWorks() {
              var selectedWorks = $(".individual:checked");
              var works = [];
              $.each(selectedWorks, function (key, value) {
                  works.push(getSelectedWork(this));
              });
              return works;
          }
  
          // verify songs in bulk
          $(document).on("click", ".js-verify-songs", function (e) {
              e.preventDefault();
              var works = getSelectedWorks();
              verifySongs(works);
          });
          // reject songs in bulk
          $(document).on("click", ".js-reject-songs", function (e) {
              e.preventDefault();
              var works = getSelectedWorks();
  
          });
  
          function getSelectedWork(element) {
              var work = new Object();
              work.WorkId = getRowData(element, "id");
              work.RowVersion = getRowData(element, "rowversion");
              work.UniqueCode = getRowData(element, "uniqueworkid");
              work.SongTitle = getRowData(element, "songtitle");
              return work;
          }
  
          // verify one song
          $(document).on("click", ".js-verify-song", function (e) {
              e.preventDefault();
              var works = [];
              works.push(getSelectedWork(this));
              verifySongs(works);
          });
          // reject one song
          $(document).on("click", ".js-reject-song", function (e) {
              e.preventDefault();
              var works = [];
              works.push(getSelectedWork(this));
          });
  
          function verifySongs(songs) {
              $('.spinnerOverlay').removeClass('hide');
                 $.ajax({
                     url: '@Url.Action("VerifyNewSongs", "SongsManagement")',
                     data: JSON.stringify(songs),
                     type: 'POST',
                     cache: false,
                     contentType: 'application/json',
                     success: function (result) {
                         $('.spinnerOverlay').addClass('hide');
                         if (result.success) {
                             loadPartialPage($(".paginate_button.active a").attr("href"));
                         }
                     },
                     error: function(error) {
                         $('.spinnerOverlay').addClass('hide');
                     }
                 });
          }
  
          @* Pagination Async Partial Handling *@
          $(document).on("click",
              "#indexPager a",
              function() {
                  if ($(this).parent().hasClass('disabled') || $(this).parent().hasClass('active'))
                      return false;
                  loadPartialPage($(this).attr("href"));
  
                  return false;
              });
  
  
  
          $(document).on("change",
              "#pageSizeSelector",
              function() {
                  var selectedValue = $(this).val();
                  loadPartialPage(selectedValue);
                  return false;
              });
  
          @* Sorting Async Partial Handling *@
          $(document).on("click",
              "#tableHeader a",
              function()
              {
                  loadPartialPage($(this).attr("href"));
                  return false;
              });
          });
  
          // Ensure that after paging and sorting ajax calls we re-bind
          // the change event and hide the record count label.
          $(document).ajaxComplete(function() {
              $(".records-selected").hide();
              $(".individual").on("change", determineActionButtonAvailability);
              $(".selectall").click(function () {
                  $(".individual").prop("checked", $(this).prop("checked"));
                  determineActionButtonAvailability();
              });
          });
  
          // Search functions
          $('.searchDivider').click(function (e) {
              $('#searchFields').slideToggle();
              var isSearchShown = $(this).find('.caret').hasClass("caret-up");
              if (isSearchShown) {
                  $(this).children('span').replaceWith('&lt;span class="bg-white"&gt;Search &lt;b class="caret"&gt;&lt;/b&gt;&lt;/span&gt;');
              } else {
                  $(this).children('span')
                      .replaceWith('&lt;span class="bg-white"&gt;Search &lt;b class="caret caret-up"&gt;&lt;/b&gt;&lt;/span&gt;');
              }
          });
  
          $(".searchArea input:text").keypress(function (e) {
              if (e.which === 13) {
                  e.preventDefault();
                  $("#btnSearch").click();
              }
          });
  
          $(window).resize(function () {
              if ($(window).width() &gt;= 1024) {
                  $('#searchFields').show();
              }
          });
  
          $(".searchArea input:text").keypress(function (e) {
              if (e.which === 13) {
                  e.preventDefault();
                  $("#btnSearch").click();
              }
          });
  
  
          // Checks individual checkboxes and displays the count
          $(".individual").on("change", determineActionButtonAvailability);
  
          $(".selectall").click(function () {
              $(".individual").prop("checked", $(this).prop("checked"));
              determineActionButtonAvailability();
          });
  
          //Disable Top Verify Button if two or more checkboxes are selected.
          $('.verify-btn').prop('disabled', true);
          //Disable Action Button in the columns when more than one checkbox is selected
          $('.table-btn').prop('disabled', false);
          $(".individual").on("click", function () {
              if ($(".individual:checked").length &gt; 1) {
                  $('.table-btn').prop('disabled', true);
                  $('.verify-btn').prop('disabled', false);
              }
              else {
                  $('.table-btn').prop('disabled', false);
                  $('.verify-btn').prop('disabled', true);
              }
          });
  
          // When one or more works are selected, will enable the top action menu.
          // Will disable when none selected.
          function determineActionButtonAvailability() {
              if ($(".individual:checked").length &gt; 1) {
                  $(".records-selected").show();
                  $("#selected").text($(".individual:checked").length);
                  $("#total").text($(".individual").length);
  
  
                  $(".verify-btn").prop('disabled', false);
                  if ($(".individual:checked").length &gt; 1) {
                  }
              }
              else {
                  $(".records-selected").hide();
                  $('.table-btn').prop('disabled', false);
                  $(".verify-btn").prop('disabled', true);
              }
          }
  
          // Enforce only numeric input in the Unique Id search textbox.
          $(document).on("keydown", ".uniqueCodefield", function (e) {
              var key = window.event ? e.keyCode : e.which;
              var currentVal = $('.uniqueCodefield').val();
              if (key === 8 || key === 9 || key === 13 || key === 37 || key === 39 || key === 35 || key === 36 || key === 46) {
                  return true;
              } else if (key === 13) {
                  $('#newSongsSearch').validate();
                  if ($('#newSongsSearch').valid()) {
                      return true;
                  }
                  return false;
                  }
              else if ((key &lt; 48 || key &gt; 57) &amp;&amp; (key &lt; 93 || key &gt; 105)) {
                  return false;
              } else if (currentVal.length &gt;= 10) {
                  return false;
              } else {
                  return true;
              }
          });
  
          @* Wire up the Search button click to perform an AJAXified search *@
          $(document).on("click", "#btnSearch", function (e) {
              e.preventDefault();
  
              // Only perform the search if the search criteria is valid.
              if (!$('#newSongsSearch').valid()) {
                  return false;
              }
  
              $('.spinnerOverlay').removeClass('hide');
  
              var model = {
                  SearchModel: {
                      WorkUniqueCode: $('#SongCode').val(),
                      SongTitle: $('#SongTitle').val(),
                      CatalogueUniqueCode: $('#CatalogueCode').val(),
                      CatalogueName: $('#CatalogueName').val(),
                      AccountUniqueCode: $('#AccountCode').val(),
                      AccountName: $('#AccountName').val()
                  }
              };
              $.ajax({
                  url: '@Url.Action("SearchNewSongs", "SongsManagement")',
                  data: JSON.stringify(model),
                  type: 'POST',
                  cache: false,
                  contentType: 'application/json',
                  success: function (result) {
                      $('#tableContainer').html(result);
                      addBootstrapTooltips("#tableContainer");
                  }
              });
  
              return false;
          });
  
  
  
  
           @* Wire up the Search button click to perform an AJAXified search *@
             $(document).on("click", "#btnSearch", function (e) {
                 e.preventDefault();
                 $('.spinnerOverlay').removeClass('hide');
  
                 var model = {
                     SearchModel : {
                         Name: $('#ContractNameSearch').val(),
                         ContractType: $('#ContractTypeSearch').val(),
                         CreatedBy: $('#CreatedBySearch').val(),
                         DateFrom : $('#DateFromSearch').val(),
                         DateTo : $('#DateToSearch').val()
                     }
                 };
                 $.ajax({
                     url: '@Url.Action("SearchContracts", "ClientSetup")',
                     data: JSON.stringify(model),
                     type: 'POST',
                     cache: false,
                     contentType: 'application/json',
                     success: function (result) {
                         $('#tableContainer').html(result);
                         addBootstrapTooltips("#tableContainer");
                     }
                 });
  
                 return false;
          });
      &lt;/script&gt;
      @Scripts.Render("~/bundles/searchusers-autosuggest")
      &lt;script src="https://cdn.jsdelivr.net/npm/sweetalert2"&gt;&lt;/script&gt;
  }
  
  
  @section additionalStyles {
      @Styles.Render("~/plugins/datatables/media/css/cssDatatables")
  }
  
  &lt;article class="row"&gt;
      &lt;h1 class="pageTitle artistHeader fw200 mb20 mt10"&gt;@ViewBag.Title&lt;/h1&gt;
  
      &lt;div class="col-md-12"&gt;
          &lt;div class="panel panel-visible"&gt;
              @Html.Partial("_NewSongsSearch", Model)
          &lt;/div&gt;
      &lt;/div&gt;
  
      &lt;div class="col-md-12"&gt;
          &lt;div class="panel panel-visible" id="tableContainer"&gt;
              @Html.Partial("_NewSongsList", Model)
          &lt;/div&gt;
      &lt;/div&gt;
  &lt;/article&gt;
  </code></pre>
  
  <p>Basically where the spinner is, if there is an error, then an alert or modal should display with the type of error, that is in the controller. I am just unsure of how I can get the errors to show in a modal.</p>
  
  <p>Is there any code that is missing from my view that would simplify adding the errors to a modal?</p>