【问题标题】:ASP.NET MVC: How to display success confirmation message after server-side processingASP.NET MVC:如何在服务器端处理后显示成功确认消息
【发布时间】:2012-11-24 12:31:36
【问题描述】:

我需要在 ASP.NET MVC 应用程序中显示确认数据库更新成功的消息。目前,应用程序仅在发生错误时显示消息(使用 ValidationSummary 助手)。如果操作成功,应用程序当前会重定向到导航中的合适点。

目标是:

  • 以适当的方式显示确认消息
  • 最大限度地减少用户在阅读消息后继续操作所需的操作
  • 避免额外的帖子/往返来显示消息
  • 最大限度地减少开发工作并在应用程序的多个点插入消息的风险

我的偏好是在提交按钮附近显示某种工具提示类型的消息,然后是删除消息并在成功后继续现有重定向的机制。

这似乎建议使用 Ajax 调用而不是现有的 HTTP POST 来提交表单。我该怎么办?

【问题讨论】:

    标签: ajax asp.net-mvc


    【解决方案1】:

    我会使用TempData["key"]

    这类似于ViewData["key"],但是数据会保留在下一个 HttpRequest 中,并在此之后由 asp.net 自动处理

    所以你可以这样做。

    控制器动作

    [HttpPost]
    public ActionResult SomePostAction(SomeViewModel vm)
    {
       if(ModelState.IsValid) // Is User Input Valid?
       {
           try
           {
               CommitData();
               TempData["UserMessage"] = new MessageVM() { CssClassName = "alert-sucess", Title = "Success!", Message = "Operation Done." };
               return RedirectToAction("Success");
           }
           catch(Exception e)
           {
               TempData["UserMessage"] =  new MessageVM() { CssClassName = "alert-error", Title = "Error!", Message = "Operation Failed." };
               return RedirectToAction("Error");
           }
    
       }
    
       return View(vm); // Return View Model with model state errors
    }
    

    _Layout.cshtml

    <!DOCTYPE html>
       <html>
         <head>
    
         </head>
         <body>
          @if(TempData["UserMessage"] != null)
          { 
              var message = (MessageVM)TempData["UserMessage"];
              <div class="alert @message.CssClassName">
                   <strong>@message.Title</strong> 
                   @message.Message
              </div>
          }
              @RenderBody()
         </body>
    </html>
    

    更多信息:http://www.devcurry.com/2012/05/what-is-aspnet-mvc-tempdata.html

    【讨论】:

    • 我喜欢这个,因为它让我可以选择在成功更新后重定向到的页面上显示消息。如果我采用这种方法,一种选择是在工具提示类型面板中显示消息,该面板会在预定时间后自动消失,不需要额外的用户操作。就所需的重构而言,它的影响也很小。谢谢!
    • 我喜欢你的回答,我唯一关心的是重定向到错误。这将阻止用户重新提交他们的帖子。或者也许就是这个想法?成功肯定会停止重复响应。但错误可能需要重新提交。
    • 嗨@Tod 我明白你的意思,但我认为你的担忧更多地与数据验证有关。如果用户提交的数据有问题,那么这将使用ModelState.IsValid 处理,然后你可以return View(vm) 我会更新我的答案以更清楚一点。
    • 我刚刚开始实现这一点,如果您要重定向到两个不同的操作,并且假设是两个不同的视图,为什么会有用户消息。只需将消息放在视图上。我对 MVC 还很陌生,我只是想了解一下。
    • @TempData["UserMessage"].CssClassName(或 .whatever)给出对象不包含 CssClassName 定义的错误。是否有一些语法调整可以查找 CssClassName?
    【解决方案2】:

    在成功操作时,您只需将成功消息描述存储到 ViewBag 中 像

    ViewBag.successMessage="Success" 
    

    然后在视图中检查 ViewBag 值是否为空?通过javascript,如果不为null,则在Div中显示消息

    if('@ViewBag.successMessage'!="")
    {
       $('#divSuccessMessage').show();
    } 
    else
    {
      $('#divSuccessMessage').hide();
    }
    

    页面加载默认隐藏div

    【讨论】:

    • 谢谢,我现在发现它比我想象的要简单。为了在显示成功消息后管理重定向到另一个页面,我想我可以在消息 div 中添加一个 onclick 处理程序。
    【解决方案3】:

    以下链接可能会对您有所帮助(发布链接,因为它需要更好的解释):

    http://msdn.microsoft.com/en-us/magazine/ff797575.aspx

    http://ofps.oreilly.com/titles/9781449320317/ch_AJAX.html

    【讨论】:

      【解决方案4】:

      正如其他人提到的,TempData 是最直接的选项之一。在我看来,它在常规 ASP.NET 中的主要缺点是它使用会话存储来存储其内容。这意味着您需要做额外的工作才能让它在网络场上运行,或者您首先需要打开会话。

      TempData 是一个基于字符串的字典,您可以在其中放入任何内容,并且默认情况下只在以后的任何请求中取出一次。在调用RedirectToAction() 之前,您设置了您的消息,并在下一个请求中检查消息并显示它们。通过检索消息,它们会在请求结束时自动删除。

      作为替代方案,您可以使用 cookie 在两个请求之间传输消息。本质上,您可以推出自己的解决方案,也可以实现自定义ITempDataProvider,通过cookie 传输TempData 的内容。鉴于消息很短,因此对性能的影响很小。请注意,您需要妥善保护 cookie。

      我遇到了同样的问题,并为此创建了一个名为 FlashMessage 的解决方案。它可以在NuGet 上找到。用法很简单:您只需在调用RedirectToAction() 之前排队一条消息,如下所示:

      FlashMessage.Confirmation("Your message");
      return RedirectToAction("AdminUsers", "Admin");
      

      在您看来,您包含以下语句来呈现任何先前排队的消息:

      @Html.RenderFlashMessages()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 2013-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-27
        相关资源
        最近更新 更多