2016-09-08 6 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 направит 302 ответа в браузер с новым URL в заголовке местоположения и браузер сделает полностью новый запрос GET для получения этой страницы. Запомнить Http является без гражданства. Второй запрос не имеет представления о том, что произошло в предыдущем запросе.

ViewBag не работает в этом сценарии. ViewBag работает только в том случае, если вы возвращаетесь к тому же самому виду. Взгляд бритвы будет в состоянии прочитать элементы мешка просмотра, потому что он был установлен во время одного и того же запроса.

Если вы хотите сохранить данные между вашим текущим запросом и следующим запросом, вы можете использовать TempData.

Вы можете установить TempData в методе действия первого запроса.

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

и в следующем запросе (Create), вы можете прочитать его как

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

срок службы TempData непродолжителен. элемент словаря TempData будет очищен в конце второго запроса. Это означает, что если вы нажмете F5 (обновить), вы не увидите предупреждение снова!

Другой вариант - отправить сообщение в строке запроса при перенаправлении. Вы можете сделать это как

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

Это добавит элемент запроса (msg), когда он перенаправляет. Вы можете добавить параметр с именем msg в действие «Создать» и прочитать это значение и сделать все, что хотите.

+0

'TempData' очищается в конце следующего ответа, а не« один раз читается ». –

+0

Абсолютно правильно. Спасибо, что поймал это. Исправлено в сообщении. – Shyju

0

Просто используйте

return View(ingresoMateriales); 

Потому что вы уже в «пост» Создать метод, он отправит вас обратно в ту же точку зрения, и вы не потеряете данные, набранный для модели,

Другой проблемой являются исключения, не рекомендуется отправлять сообщения об ошибках системы sql/backend конечным пользователям, лучше использовать их для ведения журнала и во время разработки.