【问题标题】:What is a good way to pass a confirmation or error message back to a view?将确认或错误消息传递回视图的好方法是什么?
【发布时间】:2011-03-02 06:17:56
【问题描述】:

当用户单击表单上的提交按钮时,我想向用户返回成功/失败消息,我想知道将消息发送回用户的最佳方式是什么。

例如在登录表单上,如果用户输入了错误的密码,我希望视图重新加载并显示一条消息,告诉他们登录失败。或者在更新表单上,他们的原始视图会显示更新成功的消息。

我的想法是有一些局部视图或 HTML 帮助程序来查找 ViewBag 属性,如“ErrorMessage”或“SuccessMessage”,并在这些属性有值时有条件地显示自己。这些组件可以添加到 _Layout 或手动添加到需要它们的每个表单中。

编辑

我后来发现 ValidationSummary 方法带有一个参数来判断是否排除属性错误,这意味着您可以使用它来显示登录/注册失败的时间。但是似乎有一个错误,即使没有错误,仍然会生成验证摘要。

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 razor


    【解决方案1】:

    这是一个很好的问题,我最近一直在尝试在一个新的 MVC 应用程序中解决这个问题。对我来说,ModelState.AddModelError 对于错误是可以的,但在传达成功或警告消息等信息时不起作用。

    这是我最近决定采用的一种方法,欢迎对此提出任何反馈:

    1. 我创建了一个名为 Notification 的类和一个名为 NotificationType 的枚举。 NotificationType 有 4 个值:SuccessErrorWarningInfo通知具有“消息”和“类型”属性。

    2. 我有一个名为 NotificationManager 的静态类,它在 HttpRequest 的生命周期内保存 Notification 对象的实例(使用用户的 Session 对象)。这个想法是,任何控制器都可以在执行 Action 期间添加任意数量的 Notification 对象,具体取决于它需要“告诉”用户的内容。

    3. 我有一个自定义 HtmlHelper,我在母版页中调用一次(即 Html.NotificationSummaryFor()),它接受一个 IEnumerable 通知(即 NotificationManager.Notifications)并为每个通知呈现一个带有子 LI 的 UL。然后,我使用 CSS 类根据“NotificationType”(红色表示错误、黄色表示警告、绿色表示成功等)设置这些通知 LI 的样式。 HtmlHelper 还负责在将通知渲染到 View 后清除来自管理器的通知。

    这个实现非常简单并且有局限性,但总的来说,我发现拥有这样的框架可以确保开发同一应用程序的开发团队能够以一致的方式提供通知,这对可用性和可维护性很重要.

    【讨论】:

    • 我真的很喜欢这个 Rob。这是我试图弄清楚的事情,你描述得很好,谢谢。我喜欢 any 页面可以添加通知/错误等的想法。我想知道它是否也可以扩展到异步事件。
    • 再次感谢罗伯!我刚刚实现了这个,它是我的问题的一个非常干净的解决方案。我对您所做的稍有不同的一件事是在 HttpContent.Current.Items 集合中有通知列表,这样当请求结束时,它们无论如何都会自动删除。这对我来说效果很好,因为我不希望 html 扩展必须清除它。但话又说回来,您的方式允许延迟渲染。无论如何,我对此非常满意,谢谢。
    • 我知道这是旧的,但我想知道这个建议是否存在任何数据并发问题?单例课程会更好吗?只是想知道,谢谢!
    【解决方案2】:

    asp-net-mvc-2-model-validation 这是设置验证的一种非常简单的方法。 此外,如果您正在执行诸如登录之类的操作,您可以执行类似的操作,将 modelError 添加到模型状态,然后在代码中检查它

     if (ModelState.IsValid) {
                if (!FormsAuthentication.Authenticate(userName , password))
                    ModelState.AddModelError("" , "Incorrect username or password");
            }
    
            if (ModelState.IsValid) {
                FormsAuthentication.SetAuthCookie(userName  , false);
                return Redirect(url ?? Url.Action("Index" , "Admin"));
            } else
                return View(); //goes right back to the log on screen 
    

    【讨论】:

    • 谢谢科林,我忘了说这是我目前的做法。我不喜欢这样的原因是为了显示错误,我需要在表单顶部输入:@Html.ValidationSummary()。仅此一项就可以了,但是我对元素旁边的每个元素都有客户端验证,这意味着当他们将某些内容留空时,验证错误会出现在验证摘要中和输入元素旁边。
    • 哦。那么也许你可以制作一个自定义视图模型,其中包含一个标志,表明验证是成功还是失败,然后使用 html 帮助器生成一些输出
    猜你喜欢
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多