2016-09-02 4 views
0

Ich habe eine Funktion zum Löschen eines Datensatzes aus einer DB-Tabelle implementiert. Wenn es einen Fehler gibt, möchte ich es in ViewBag übergeben. Der ViewBag-Wert wird jedoch nicht an die Ansicht übergeben.ASP.Net MVC ViewBag arbeitet nicht an Funktionen, die von AJAX aufgerufen werden

-Controller

[HttpPost] 
    public ActionResult DeleteRecord(string name) 
    { 
     try 
     { 
      if (!(string.IsNullOrEmpty(name))) 
      { 
       driver_tab driver = db.driver_tab.SingleOrDefault(m => m.Name == name); 
       db.driver_tab.Remove(driver); 
       db.SaveChanges(); 
       ViewBag.Msg = "1"; 
       MessageBox.Show(ViewBag.Msg); 
       return View("Main"); 
      } 
      else 
      { 
       ViewBag.Msg = "2"; 
       return View("Main"); 
      } 
     } 
     catch (DbEntityValidationException ex) 
     { 
      ViewBag.Msg = ex.Message.ToString(); 
      return View("Main"); 
     } 
     catch (Exception ex2) 
     { 
      ViewBag.Msg = ex2.Message; 
      return View("Main"); 
     } 
    } 

Ajax-Funktion in Ansicht

function DeleteSelectedRecord() { 
    var SelectedName = $("#lstItems").val() 
    $.ajax({ 
     url: 'DeleteRecord', 
     method: "POST", 
     data: { name: SelectedName } 
    }).done(function() { 
     $("#lstItems").empty(); 
     Search(); 
     GetCount(); 
     $('#modalDeleted').modal('show'); 
     setTimeout(function() { $('#modalDeleted').modal('hide'); }, 2000); 
    }); 
} 

Ich benutze diese ViewBag.Msg in der Ansicht Gefällt Ihnen dieses <h2>@ViewBag.Msg Aber es funktioniert nicht. Was ist das Problem in meinem Code?

Wenn ein Fehler in der Steuerung nach dem Ausführen der Löschfunktion aufgetreten ist, möchte ich diese Nachricht an die Ansicht übergeben und anzeigen. Wie erreiche ich das?

+0

Könnten Sie bitte entfernen MessageBox.Show (ViewBag .Msg); Aussage und versuchen? –

Antwort

0

Wenn Sie zu einer anderen Aktion umleiten sollten Sie TempData wie folgt verwenden:

catch (DbEntityValidationException ex) 
{ 
    TempData["error"] = ex.Message.ToString(); 
    return View("Main"); 
} 

Und in der Ansicht:

<h2>@Html.Display(TempData["error"])</h2 
1

Sie sind AJAX ist nicht die Antwort von DeleteRecord verwenden. Dies enthält den gerenderten HTML-View einschließlich der ViewBag-Daten.

Sie benötigen JavaScript zu aktualisieren, um die Reaktion zu verwenden, um Ihren Code suchen Ich glaube, das die modale aufzufüllen braucht Ihre Anzeige:

Etwas wie:

$.ajax({ 
    url: 'DeleteRecord', 
    method: "POST", 
    data: { name: SelectedName } 
}).done(function (data) { 
    // Do something with response data, for example: 
    $('#modalDeleted').html(data); 
}); 
0

Sieht aus wie Sie die zurückkehr Ansicht von einer anderen Aktion, dh Umleiten von der DeleteRecord-Aktionsmethode zur Hauptaktionsmethode, wenn dies der Fall ist, müssen Sie TempData anstelle von ViewBag verwenden.

0

Sie tun einen AJAX-POST, und Sie können eine Umleitung/Ansicht Änderung von Server-Seite mit Ajax tun. Wenn Sie das Ergebnis in ajax success callback überprüfen, zB `done (function (data) {....}) ;, sollten Sie erhalten, was von Ihrer Aktionsmethode zurückgegeben wird, hier würde es gerendert werden html der Hauptansicht.

Wenn die Idee, eine Rückantwort von Löschaktion zu erhalten ist, dann wieder Json result statt View result der Rückkehr:

[HttpPost] 
public JsonResult DeleteRecord(string name) 
{ 
    ..... 
    return Json(new {message = "your message based on business rule" }, JsonRequestBehavior.AllowGet); 

} 

und in Javascript

function DeleteSelectedRecord() { 
    var SelectedName = $("#lstItems").val() 
    $.ajax({ 
     url: 'DeleteRecord', 
     method: "POST", 
     data: { name: SelectedName } 
    }).done(function (result) { 

     //append this message to any container of your view 
     var message = result.message; 

     $("#lstItems").empty(); 
     Search(); 
     GetCount(); 
     $('#modalDeleted').modal('show'); 
     setTimeout(function() { $('#modalDeleted').modal('hide'); }, 2000); 
    }); 
} 
Verwandte Themen