【问题标题】:ASP.net MVC Success Alert After Form submit表单提交后 ASP.net MVC 成功警报
【发布时间】:2014-05-06 23:05:12
【问题描述】:

我想在表单提交和操作成功后显示成功弹出警报或警报消息
在此示例中,我想显示“成功添加”: Create Action

[HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Create(TAUX taux)
    {
        if (ModelState.IsValid)
        {
            db.TAUX.Add(taux);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        ViewBag.CAT_ID = new SelectList(db.CATEGORIE, "CAT_ID", "LIBELLE", taux.CAT_ID);
        ViewBag.C_GARANT = new SelectList(db.GARANTIE, "C_GARANT", "LIB_ABREGE", taux.C_GARANT);
        return PartialView("_Create", taux);
    }

Index Action

public ActionResult Index()
        {
            var taux = db.TAUX.Include(t => t.CATEGORIE).Include(t => t.GARANTIE);
            return View(taux.ToList());
        }

我应该添加什么来做到这一点?

【问题讨论】:

  • @MikeSW 我已经尝试过this,但我遇到了一些问题,因为我想在我的索引视图中显示成功消息,例如不在单独的 PartialView 中

标签: javascript jquery asp.net-mvc asp.net-mvc-4


【解决方案1】:

这是可能的,当然,但实施细节可能会因技术和应用结构而异。

执行此操作的最常见方法之一(我目前使用的方法非常成功)是接收 whater-you-need-to-receive 并返回带有状态和/或错误消息的 JSON 对象, 这将被您视图上的某些脚本使用。

例如:

[Route(""), HttpPost]
public JsonResult DoSomethingOnTheServer(DoSomethingViewModel vm)
{
   try
   {
      if (DoSomething(vm)) return Success();
      else return Error("The server wasn't able to do something right now.");
   }
   catch (Exception err)
   {
      return Error(err.Message);
   }
}

public JsonResult Success() { return Json(new { Success = true, Message = "" }); }
public JsonResult Error(string message) { return Json(new { Success = false, Message = message }); }

这样,您可以执行以下操作:

<script>
   $.ajax({
      url: "/",
      method: "POST",
      data: getMyData(),

      success: function(json) {
         if (json.Success) {
            alert("Wow, everything was fine!");
         } else {
            alert(json.Message);
         }
      },

      // This will be trigered whenever your ajax call fails (broken ISP link, etc).
      error: function() {
         alert("Something went wrong. Maybe the server is offline?");
      }
   });
</script>

老实说,您可以提交表单(我的意思是定期提交)并在页面刷新时显示您想要的任何内容。

但是,这将迫使您在视图模型中加载额外的内容,例如额外的 &lt;script&gt; 标记或一些额外的 &lt;div&gt; 标记,并且每次都要检查。

从可用性/设计的角度来看,这是不行的。尽可能避免页面刷新,因为它们会给用户一种应用正在消失或他/她现在正在移出应用的感觉。

此外,从性能的角度来看,“完整往返”到服务器,包括发送表单数据和检索一个全新的页面(包括整个布局、脚本、razor 渲染/解析和所有) 是一个巨大的问题,只是为了向最终用户显示“成功/失败”,所以再次重申:尽可能避免它。

恕我直言,返回视图或部分视图只是为了向最终用户显示消息只是浪费你的您的最终用户的链接。

【讨论】:

  • 谢谢,但是Ajax脚本要放在哪里呢?在我的部分视图中我的表单,还是在索引视图中?
  • 对不起,我不能在这里以简单的方式正确回答这个问题。会太宽泛。如果你想将这个 wither 绑定到提交按钮或直接挂钩到表单的提交方法,如果你有一个表单等等,这会从你放置 jQuery 引用的位置发生变化。也许一些谷歌搜索'将其与您的表单提交挂钩可能会有所帮助,但同样,这与您的上下文发生了很大变化。听起来现在是另一个问题的好候选人......
  • 我把 Ajax Script 放在了我的 PartialView 中,但现在当我点击添加按钮时,引导模式 dosn'y 不再出现
  • 另外,Route("") 是未知的,它没有检测到它属于哪个名称空间
【解决方案2】:

我曾经制作过 Ajax 表单,并在 OnSuccess 功能中显示消息:

@using (Ajax.BeginForm("Edit1", "Availability", new AjaxOptions { HttpMethod = "POST", InsertionMode = InsertionMode.InsertBefore, UpdateTargetId = "formAddAvailabilityContainer", OnSuccess = "AddAvailabilitySuccess" }, new { @class = "AjaxForm", @id = "formAvailability_" + Model.Id }))
    {
        @Html.ValidationSummary(true)




        @Html.HiddenFor(model => model.Id)
        @Html.HiddenFor(model => model.UserId)

        @Html.EditorFor(model => model.StartTime)
        @Html.MyValidationMessageFor(model => model.StartTime)

        @Html.EditorFor(model => model.EndTime)
        @Html.MyValidationMessageFor(model => model.EndTime)

        @Html.EditorFor(model => model.RecurrenceFreq)
        @Html.MyValidationMessageFor(model => model.RecurrenceFreq)



      @Html.TextBoxFor(model => model.EndsAfterValue, new {id="txtBoxEndsAfterValue" })
     @Html.MyValidationMessageFor(model => model.EndsAfterValue)



    @Html.EditorFor(model => model.EndsByDate)


    <input type="submit" class="btn btn-primary" value="Save" id="btnsubmit" />
   <input type="button" class="btn btn-primary btnCancelAvailability" id="0" value="Cancel">


    }


 <script>

    function AddAvailabilitySuccess()
    {

    alert("Record updated successfully!");

    }

    </script>

【讨论】:

  • 在我的控制器上我是否必须更改我的操作?
  • 是而不是重定向返回空结果或部分视图
  • 你能解释一下这部分UpdateTargetId = "formAddAvailabilityContainer",OnSuccess = "AddAvailabilitySuccess" },new { @class = "AjaxForm", @id = "formAvailability_" + Model.Id }))。对不起,我是初学者
  • updatetargetid 表示某些元素的 id,在该元素上主要显示 div,其中显示了 ajax 帖子的返回结果,OnSuccess 表示在 ajax 表单上成功调用执行此 javascript 函数,逗号后的下一个是表单的 html 属性是类和id
【解决方案3】:

我有办法做到这一点,使用 ViewBag。

您必须在控制器中添加:

if (ModelState.IsValid)
        {
            db.TAUX.Add(taux);
            db.SaveChanges();
            ViewBag.SuccessMsg = "successfully added";
            return RedirectToAction("Index");
        }

然后在索引视图中:

@{
    var message = ViewBag.SuccessMsg;
}

<script type="text/javascript">
    var message = '@message';
    if(message){
        alert(message);
    }
</script>

最后你使用 JavaScript 和 MVC ViewBag :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多