2010-10-05 25 views
6

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

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

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

在传统的ASP和ASP.NET的旧时代,我会处理输入,然后向用户显示成功消息或带有错误的表单 - 全部来自同一页面。这看起来不符合最佳实践(SRP,视图中没有逻辑等)。

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

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

回答

3

我使用具有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> 

我敢肯定有可能是更好的方法,比如使用过滤器,但这种方法是非常有帮助的,我。

+0

,如果用户中止请求和/或快速点击另一个链接(导航到另一个页面),则用户将在不正确和令人困惑的环境中看到来自TempData的消息。这是因为TempData会被任何第一个用户的请求发送到服务器。 – queen3 2010-10-05 14:36:01

1

你可以把东西可视数据,并在页面做类似

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

和您的用户将看到一个弹出窗口,告诉他关于成功 http://jqueryui.com/demos/dialog/

+1

如果您是用户Post-Redirect-Get(PRG)模式,则必须使用TempData而不是ViewData。 – uvita 2010-10-05 14:26:24

+1

@uvita不一定,它可能是像返回RedirectToAction(“索引”,新{成功= true});并且索引动作设置了我必须指出的视图数据 – Omu 2010-10-05 16:27:58