ASP.NET MVC 向最终用户显示操作成功

Posted

技术标签:

【中文标题】ASP.NET MVC 向最终用户显示操作成功【英文标题】:ASP.NET MVC Show to end user that action was successful 【发布时间】:2010-10-05 13:29:05 【问题描述】:

我见过的大多数 ASP.NET MVC 示例都描述了用户正在查看对象(或对象集合)然后从该页面移动到显示用户完成的表单的页面的场景。提交具有良好输入的表单后,用户将被重定向回显示对象(或列表)的页面,并且用户可以看到他们的更改已成功。

我遇到了一个场景,每个业务规则都没有视图或列表页面。

在 ASP.NET MVC 中针对这种情况有哪些好的方法?

在过去使用经典 ASP 和 ASP.NET 时,我会处理输入,然后向用户显示成功消息或带有错误的表单——所有这些都来自同一个页面。这似乎违反了最佳实践(SRP、视图中没有逻辑等)。

一种简单的方法是重定向到一个新页面,告诉用户他们的更改已成功,然后用户可以随时访问该页面。如果我开始输入逻辑来防止这种情况(即临时数据),那么解决方案就会开始变得肮脏。

我可以重定向到登录页面,但没有确认。也许我可以依赖一个消息系统,在最终用户返回登录页面时向他们显示确认信息?

【问题讨论】:

【参考方案1】:

我使用具有 ShowMessage 方法的基本控制器。此方法接收要显示的消息(或资源键,如您所愿)和指示消息类型(成功、错误、通知等)的枚举。在返回操作之前,我使用适当的消息调用 ShowMessage,例如

ShowMessage("A nice message here.", MessageType.Success);

然后,在母版页中,我调用了一个辅助方法,该方法呈现一个共享的局部视图,该视图显示消息以防万一。消息使用固定密钥存储在TempData 中。您可以使用Blueprint css framework 中出现的样式根据消息的类型显示消息。

这里是一些代码:

public void ShowMessage(string message, MessageType messageType)

    var messageViewModel = new MessageViewModel(message, messageType);
    TempData["Message"] = messageViewModel;
 

局部视图:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyApp.Models.MessageViewModel>" %>
<%var className = Model.MessageType.ToString().ToLower(); %>
<div class="<%=className%>">
    <%=html.Encode(Model.Message)%>
</div>

我确信可能有更好的方法,例如使用过滤器,但这种方法对我很有帮助。

【讨论】:

我必须指出,如果用户中止请求和/或快速点击另一个链接(导航到另一个页面),那么用户将在不正确和令人困惑的环境中看到来自 TempData 的消息。这是因为 TempData 将被任何第一个用户访问服务器的请求拾取。【参考方案2】:

您可以在 viewdata 中添加一些内容,然后在页面中执行类似的操作

<% if (viewdata["success"] != null)%>
<script>
$("#successDialog").dialog('open');
</script>
<%%> 

你的用户会看到一个弹出窗口告诉他成功 http://jqueryui.com/demos/dialog/

【讨论】:

如果您使用 Post-Redirect-Get (PRG) 模式,则必须使用 TempData 而不是 ViewData。 @uvita 不一定,它可能类似于 return RedirectToAction("Index", newsuccess=true);并且 index 操作设置 viewdata

以上是关于ASP.NET MVC 向最终用户显示操作成功的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS2 + ASP.NET MVC项目

在asp.net mvc中注册成功(重定向到登录)后用户名自动填写登录页面

AJAX 回调未显示成功消息 - ASP.NET MVC C#

ASP.net MVC - 视图上的多个表单,每个调用不同的操作,但需要再次显示相同的视图

ASP.NET MVC 中密码重置的最佳实践

ASP.NET MVC:如何防止会话锁定?