ASP.NET MVC:如何在服务器端处理后显示成功确认消息

时间:2012-11-24 12:31:37

标签: ajax asp.net-mvc

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

目标是:

  • 以适当的方式显示确认消息
  • 尽量减少阅读邮件后继续执行的用户操作
  • 避免额外的帖子/往返以显示消息
  • 最大限度地减少开发工作量,并有可能在应用程序的多个点插入消息

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

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

4 个答案:

答案 0 :(得分:51)

我会使用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

答案 1 :(得分:15)

成功操作后,您只需将成功消息说明存储到ViewBag中 像是

ViewBag.successMessage="Success" 

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

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

默认页面加载隐藏div

答案 2 :(得分:1)

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

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

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

答案 3 :(得分:0)

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

>>> arr = [['england', 'london'], ['whales', 'cardiff']] >>> arr [['england', 'london'], ['whales', 'cardiff']] >>> arr[1][0] 'whales' >>> arr.append(['scottland', 'Edinburgh']) >>> arr [['england', 'london'], ['whales', 'cardiff'], ['scottland', 'Edinburgh']] 是一个基于字符串的字典,您可以在其中添加任何内容,默认情况下,以后再发送一次,都只能将其取出。在致电TempData之前,请先设置您的消息,然后在下一个请求时检查并显示消息。通过检索消息,它们将在请求结束时自动删除。

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

我也遇到了与您同样的问题,并为此创建了一个名为 NuGet 的解决方案。它在SPARQL W3C doc上可用。用法很简单:您只需在致电TempData之前先排队一条消息,如下所示:

RedirectToAction()

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

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