2016-09-08 6 views
0

Ich möchte eine Nachricht zu meiner Ansicht von meinem Controller anzeigen, aber es passiert nichts. Ich verwende ViewBag.Message, um die Nachricht anzuzeigen. Ich weiß nicht, ob ich einen Fehler in meinem Code mache oder es ist nicht richtig, es zu tun. Dies ist mein Code:Nachricht anzeigen

Controller:

[HttpPost] 
    [ValidateAntiForgeryToken] 
    public ActionResult Create([Bind(Include = "Id_IngresoM,Id_Componente,Lote,Serie,Cantidad,Id_Usuario")] IngresoMateriales ingresoMateriales) 
    { 
     var user = "1ef69472-1b7d-460d-a6f9-9d458c5e314e"; 
     string msj = ""; 
     try 
     { 
      var affectedRows = db.Database.ExecuteSqlCommand("IngresoMaterialesInspeccion @IdComponente, @Lote, @Serie, @Cantidad, @IdUsuario", 
             new SqlParameter("@IdComponente", ingresoMateriales.Id_Componente), 
             new SqlParameter("@Lote", ingresoMateriales.Lote), 
             new SqlParameter("@Serie", ingresoMateriales.Serie), 
             new SqlParameter("@Cantidad", ingresoMateriales.Cantidad), 
             new SqlParameter("@IdUsuario", user)); 

      //ModelState.AddModelError("", "El Certificado no esta Vigente"); 
      if (affectedRows == '3') 
      { 
       msj = "El Certificado no esta Vigente"; 
      } 
      else if (affectedRows == '2') 
      { 
       msj = "El Componente esta libre de Inspeccion"; 
      } 
      else if (affectedRows == '1') 
      { 
       msj = "Componente Sospechoso"; 
      } 
      else 
      { 
       msj = "Pues nada"; 
      } 
      ViewBag.Message = msj; 
      return RedirectToAction("Create"); 
     } 
     catch (SqlException ex) 
     { 
      foreach (SqlError Error in ex.Errors) 
      { 
       return new JavaScriptResult { Script = Error.ToString() }; 
      } 
     } 

     ViewBag.Message = msj; ------------------------------ 
     return View(); 
    } 

Ausblick:

<div class="form-group"> 
     @Html.LabelFor(model => model.Serie, htmlAttributes: new { @class = "control-label col-md-2" }) 
     <div class="col-md-10"> 
      <input class="form-control" type="text" id="Serie" name="Serie" onkeypress="FunctionS(event)" /> 
      @Html.ValidationMessageFor(model => model.Serie, "", new { @class = "text-danger" }) 
     </div> 
    </div> 


    @if (ViewBag.Message != null) 
    { 
     <script type="text/javascript"> 
     window.onload = function() { 
      alert("@ViewBag.Message"); --------------------- 
     }; 
     </script> 
    } 
</div> 
+1

Es hat keinen Sinn, "ViewBag.Message" einen Wert zuzuweisen, wenn Sie dann umleiten. –

Antwort

1

RedirectToAction wird eine 302-Antwort an den Browser mit der neuen URL im Location-Header und der Browser ein machen senden völlig neue GET-Anfrage, um diese Seite zu bekommen. Denken Sie daran, Http ist zustandslos. Ihre zweite Anfrage hat keine Ahnung, was bei der vorherigen Anfrage passiert ist.

ViewBag funktioniert in diesem Szenario nicht. ViewBag funktioniert nur, wenn Sie zur selben Ansicht zurückkehren. Die Razor-Ansicht kann die Elemente der Ansichtstasche lesen, da sie während der gleichen Anfrage festgelegt wurde.

Wenn Sie Daten zwischen Ihrer aktuellen Anfrage und der nächsten Anfrage beibehalten möchten, sollten Sie TempData verwenden.

Sie können TempData in der Aktionsmethode der ersten Anforderung festlegen.

TempData["Message"] = "Some message in Request 1"; 
return RedirectToAction("Create"); 

und in der nächsten Anfrage (Create), können Sie es wie

@if (TempData["Message"] != null) 
{ 
    <script type="text/javascript"> 
     window.onload = function() { 
      alert("@(TempData["Message"] as string)"); 
     }; 
    </script> 
} 

TempData Lebenszeit kurz ist, lesen. Das TempData-Wörterbuchelement wird am Ende der zweiten Anfrage gelöscht. Das heißt, wenn Sie F5 (Aktualisieren) drücken, wird die Warnung nicht mehr angezeigt.

Eine andere Möglichkeit besteht darin, die Nachricht während der Weiterleitung in der Abfragezeichenfolge zu senden. Sie können es tun, wie

return RedirectToAction("Create",new { msg="SomeMessageGoesViaQueryString"); 

Dies wird ein Querystring Element (msg) hinzufügen, wenn es die Umleitung macht. Sie können der Create-Aktion einen Parameter mit dem Namen msg hinzufügen und diesen Wert lesen und alles tun, was Sie tun möchten.

+0

'TempData' wird am Ende der nächsten Antwort gelöscht - nicht" einmal gelesen ". –

+0

Absolut korrekt. Danke, dass du das verstanden hast. In der Post behoben. – Shyju

0

Gerade

return View(ingresoMateriales); 

verwenden, da Sie bereits in der „post“ Create-Methode sind, wird es Sie zurück in die gleiche Ansicht senden und Sie erhalten die Daten, die Sie für das Modell eingegeben nicht verlieren,

Ein weiteres Problem sind die Ausnahmen, es wird nicht empfohlen, sql/backend Systemfehlermeldungen an den Endbenutzer zu senden, besser für die Protokollierung und während der Entwicklung.

Verwandte Themen