显示要查看的消息

时间:2016-09-08 22:58:20

标签: asp.net-mvc razor

我想从我的控制器向我的视图显示一条消息,但它不会发生任何事情。我正在使用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>

2 个答案:

答案 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系统错误消息发送给最终用户,更好地将其用于日志记录和开发过程中。