在MVC中提供用户通知/确认的推荐方法是什么?
我遇到的一个常见情况是在用户执行操作后通知他们成功后向用户提供通知/确认。
例如,假设用户提供反馈表单的反馈,然后单击“ 提交反馈” 。 您可能希望在执行某些validation后显示“感谢您的反馈”消息,例如他们在数据库中有一封有效的电子邮件。 一些伪代码:
public ActionResult SubmitFeedback(string Feedback, int UserID) { MyDataContext db = new DataContext() if(db.usp_HasValidEmail(UserID)) //Check user has provided a valid email return View("Index"); //Return view and display confirmation else ModelState.AddModelError("InvalidEmail", "We do not hold an email record for you. Please add one below"); return View("Index); }
我理解如何通过使用Html.ValidationMessage
等validation条目。这很好,我通常检查无效的条目,无论是在客户端使用jQuery还是在我的Action早期(即在我开始访问数据库之前)并退出我的操作,如果有是无效的条目。
但是,所有条目都有效并且您想要显示确认消息的情况如何?
选项1 : 拥有完全独立的视图
这似乎违反了DRY原则,通过使用全新的View(和ViewModel)来显示几乎相同的信息,期望用户通知。
选项2 : 视图中的条件逻辑
在这种情况下,我可以在View中有一个条件语句,用于检查SubmitFeedback
Action中传递的某些TempData是否存在。 再次,伪代码:
Thanks for your Feedback!
选项3 : 使用jQuery检查页面加载时的TempData
在这种情况下,我将有一个隐藏字段,我将通过SubmitFeedback
Action填充TempData。 然后我会使用jQuery来检查隐藏的字段值。 更多伪代码:
//in View $(document).ready(function() { if ($("input[name='HiddenField']").length > 0) $('div.notification').show(); setTimeout(function() { $('div.notification').fadeOut(); }, 3000); });
我对此的初步想法是:
- 选项1:完全分离视图但看起来有点过分和低效(违反DRY)
- 选项2:足够简单,但在视图中有条件逻辑(难道我没有在MVC祭坛上为此牺牲?!?)
- 选项3:感觉就像是过于复杂的事情。 它确实避免了View中的逻辑。
怎么说你? 选项1,2,3或没有? 有没有更好的办法?
请扩充我的编码模式!
我喜欢选项1.此外,您不需要条件,它适用于禁用的JavaScript。 只需将其粘贴在母版页的某个位置即可:
<%= Html.Encode(TempData["Notification"]) %>
你当然可以通过使用一些漂亮的插件(如jGrowl或Gritter)来逐步增强/动画,甚至可以看看StackOverflow是如何做到的 。
另一个解决方案是编写一个可能是最好的帮助器:
public static class HtmlExtensions { public static MvcHtmlString Notification(this HtmlHelper htmlHelper) { // Look first in ViewData var notification = htmlHelper.ViewData["Notification"] as string; if (string.IsNullOrEmpty(notification)) { // Not found in ViewData, try TempData notification = htmlHelper.ViewContext.TempData["notification"] as string; } // You may continue searching for a notification in Session, Request, ... if you will if (string.IsNullOrEmpty(notification)) { // no notification found return MvcHtmlString.Empty; } return FormatNotification(notification); } private static MvcHtmlString FormatNotification(string message) { var div = new TagBuilder("div"); div.AddCssClass("notification"); div.SetInnerText(message); return MvcHtmlString.Create(div.ToString()); } }
然后在你的主人:
<%= Html.Notification() %>
对于一般的通知内容,我通常创建一个部分视图来隐藏丑陋的条件代码,并将其包含在我的主布局中。
所以,在主人的适当位置:
<% Html.RenderPartial("_Notifications") %>
在局部视图中:
<% if(TempData["UserNotification"] != null {%> Thanks for your Feedback! <% } %>