36

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

目标是:

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

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

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

4

4 回答 4

61

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

于 2012-11-25T10:47:35.553 回答
16

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

ViewBag.successMessage="Success" 

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

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

页面加载默认隐藏 div

于 2012-11-25T07:21:17.080 回答
1

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

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

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

于 2012-11-24T12:39:46.753 回答
0

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

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

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

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

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

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

@Html.RenderFlashMessages()
于 2019-12-02T22:14:22.430 回答