【问题标题】:Show a message to the user after the data has been saved保存数据后向用户显示消息
【发布时间】:2019-04-26 03:19:39
【问题描述】:

我想在数据保存后向用户显示一条成功消息。我在控制器中创建了一个 Viewbag 并在视图中调用它。单击保存按钮后,数据已保存,但未出现成功消息。它立即重定向到索引页面。下面是我的代码,谢谢

控制器

  [HttpPost]
  [ValidateAntiForgeryToken]
  public ActionResult Create(ParamNoRekeningSumberDana model)
  {
     ViewBag.SuccessCreate = "";
     if (ModelState.IsValid)
     {
          ParamNoRekeningSumberDana newrecord = new ParamNoRekeningSumberDana();
          newrecord.ID = Guid.NewGuid();
          newrecord.AccountNo = model.AccountNo;
          newrecord.CreatedBy = Session["UserName"].ToString();

          db.ParamNoRekeningSumberDanas.Add(newrecord);
          db.SaveChanges();
          ViewBag.SuccessCreate = "Saved successfully";

          return RedirectToAction("Index");
       }
       else{
          return View(model);
       }
  }

查看

@{
  if (ViewBag.SuccessCreate != null){
    <script type="text/javascript">
        var temp = @Html.Raw(Json.Encode(ViewBag.SuccessCreate));
        alert(temp);
    </script>
  }
}
@using (Html.BeginForm())
{
    <div class="form-group">
        @Html.LabelFor(model => model.AccountNo, htmlAttributes: new { @class = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.AccountNo, (List<SelectListItem>)ViewBag.AccountNos, new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.AccountNo, "", new { @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
}

【问题讨论】:

  • 您想在哪个页面上显示消息?如果在带有表单的视图上,那么您不应该在Create 内使用RedirectToAction。理想情况下,此操作的调用应该是异步的(使用 ALAX),它应该返回您的消息或其他一些成功的指示符。然后在 ajax 成功回调中,您可以显示消息并将用户重定向到索引页面。否则,如果您想在索引页面上显示此消息,那么您应该使用临时数据并在索引页面上检查它,而不是在带有表单的视图上。
  • 其实消息显示在哪里都没有关系,可以在create或者index中显示。但在我的代码中,它显示在创建页面上,如果出现消息,用户将单击消息上的确定,然后重定向到索引。还是有更简单的方法? @RomanKoliada
  • 如果您只想在单击消息后重定向用户,那么恐怕没有其他方法可以使用ajax请求并在客户端重定向。
  • 如果如您之前所说,使用临时数据在索引页面上发出成功消息怎么办?如果可能的话,你能告诉我如何使用它吗? @RomanKoliada

标签: c# asp.net-mvc razor


【解决方案1】:

看看这个问题 (Set Viewbag before Redirect),他们解释了在这些情况下您应该在 Viewbag 上使用 TempData。

当你返回一个 View 时,Viewbag 仍然适用于 View 上下文。但是当您使用 RedirectToAction 时,它实际上是一个 HTTP 重定向,因此 .NET 在创建另一个要在此新页面上使用的实例时“清除” ViewBag。

您可以在此处阅读更多信息:https://www.c-sharpcorner.com/blogs/viewdata-vs-viewbag-vs-tempdata-in-mvc1

【讨论】:

  • 谢谢你的回答,那我是不是直接把Viewbag改成TempData了?有什么改变吗? @Caio César S. Leonardi
  • 是的,使用 TempData["Success"] = "保存成功";然后在视图中 var temp = '@TempData["Success"]'
  • 抱歉,我没有注意到您正在重定向到 Index。
  • var temp = '@TempData["Success"] 是在创建页面还是在索引页面创建的? @卢先生
【解决方案2】:

控制器

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(ParamNoRekeningSumberDana model)
{
    if (ModelState.IsValid)
    {
        ParamNoRekeningSumberDana newrecord = new 
        ParamNoRekeningSumberDana();
        newrecord.ID = Guid.NewGuid();
        newrecord.AccountNo = model.AccountNo;
        newrecord.CreatedBy = Session["UserName"].ToString();

        db.ParamNoRekeningSumberDanas.Add(newrecord);
        db.SaveChanges();
        TempData["SuccessCreate"] = "Saved successfully";

        return RedirectToAction("Index");
   }
   else
   {
         return View(model);
   }

}

查看

  @{
     if (ViewBag.SuccessCreate != null){
       <script type="text/javascript">
        var temp = '@TempData["SuccessCreate"]';
        alert(temp);
       </script>
     }
  }
  @using (Html.BeginForm())
  {
    <div class="form-group">
        @Html.LabelFor(model => model.AccountNo, htmlAttributes: new { @class 
         = "control-label col-md-2" })
        <div class="col-md-10">
            @Html.DropDownListFor(model => model.AccountNo, 
   (List<SelectListItem>)ViewBag.AccountNos, new { @class = "form-control" })
            @Html.ValidationMessageFor(model => model.AccountNo, "", new { 
     @class = "text-danger" })
        </div>
    </div>
    <div class="form-group">
        <div class="col-md-offset-2 col-md-10">
            <input type="submit" value="Create" class="btn btn-default" />
        </div>
    </div>
   }

【讨论】:

    猜你喜欢
    • 2018-06-18
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    • 2020-03-04
    • 1970-01-01
    相关资源
    最近更新 更多