我想从我的控制器向我的视图显示一条消息,但它不会发生任何事情。我正在使用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>
答案 0 :(得分:1)
RedirectToAction
将使用位置标题中的新网址向浏览器发送302响应,浏览器将发出一个全新的GET请求来获取该页面。记住 Http是无状态的。你的第二个请求不知道他之前的请求发生了什么。
ViewBag在此方案中不起作用。仅当您返回到同一视图时,ViewBag才起作用。 Razor视图将能够读取视图包项目,因为它是在同一请求期间设置的。
如果要在当前请求和下一个请求之间保留数据,可以考虑使用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
的参数添加到“创建”操作中,并读取此值并执行您想要执行的操作。
答案 1 :(得分:0)
只需使用
return View(ingresoMateriales);
因为你已经在&#34; post&#34;创建方法,它会将您发送回相同的视图,您不会丢失为模型键入的数据,
另一个问题是异常,不建议将sql / backend系统错误消息发送给最终用户,更好地将其用于日志记录和开发过程中。