2016-09-08 7 views
0

自分のコントローラから自分のビューにメッセージを表示したいが、何も起こらない。 ViewBag.Messageを使用してメッセージを表示しています。私は自分のコードで間違いを犯しているのか、これが正しい方法ではないのか分かりません。これは私のコードです:表示するメッセージを表示する

コントローラー:

[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(); 
    } 

ビュー:

<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

リダイレクトすると、「ViewBag.Message」に値を割り当てるポイントがありません。 –

答えて

1

RedirectToActionは、ロケーションヘッダーに新しいURLをブラウザに302応答を送信し、ブラウザが行いますそのページを手に入れるための全く新しいGETリクエスト。 Httpはステートレスを忘れないでください。あなたの2番目のリクエストは、前のリクエストで何が起こったのか分かりません。

このシナリオでは、ViewBagは機能しません。 ViewBagは、同じビューに戻る場合にのみ機能します。剃刀のビューは、同じ要請の間に設定されたため、ビューバッグのアイテムを読み取ることができます。

現在のリクエストと次のリクエストの間でデータを保持する場合は、TempDataの使用を検討することができます。

TempDataは、最初のリクエストのアクションメソッドで設定できます。

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

と次の要求(Create)で、あなたはTempDataをの寿命が短い

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

のようにそれを読むことができます。 TempDataディクショナリ項目は、2番目の要求の最後にクリアされます。つまり、F5(リフレッシュ)を押すと、アラートは再び表示されません。

別のオプションは、リダイレクト中にクエリ文字列内のメッセージを送信することです。あなたはそれを好むことができます

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

これは、リダイレクトを行うときにクエリ文字列(msg)を追加します。 Createアクションにmsgという名前のパラメータを追加し、この値を読み込んで、何をしたいかを実行できます。

+0

'TempData'は次回の応答の最後にクリアされます。 –

+0

絶対に正しい。それをキャッチするためにありがとう。投稿で修正されました。 – Shyju

0

ちょうどあなたが「ポスト」メソッドを作成して、すでにあるので、それが同じビューに戻りますが送信されます

return View(ingresoMateriales); 

を使用すると、あなたがモデルに入力されたデータを、失うことはありません

もう1つの問題は例外ですが、SQL /バックエンドシステムのエラーメッセージをエンドユーザーに送信することは推奨されません。

関連する問題