【问题标题】:Success messages as opposed to model state error messages与模型状态错误消息相反的成功消息
【发布时间】:2011-01-09 17:22:29
【问题描述】:

对于错误消息、验证错误等,您有

ModelState.AddErrorMessage("Fool!");

但是,您将诸如“您成功地将很多钱转移给您的前任”之类的成功回复放在哪里? +“您的余额现在为零”。我仍然想在控制器级别设置它,最好以键值方式设置,与错误消息相同,但不会使模型状态无效。

这通常是怎么做的?查看数据?

【问题讨论】:

  • 我没有研究过这个选项,但是您是否考虑过扩展 ModelState 对象以包含成功消息和失败消息?

标签: c# asp.net asp.net-mvc modelstate


【解决方案1】:

我会用我想在控制器中显示的消息填充 TempData["success"](或者你想给它的任何键),然后适当地重定向(例如,如果我编辑用户,我会重定向回用户列表)。这依赖于 POST/Redirect/GET 模式 - 无论如何这是一个好习惯。

TempData["success"] = "Your Balance is now zero";

在母版页中,我有一个部分检查该变量并以漂亮的 div 样式显示消息。类似的东西(可能不是 100% 正确):

<% if(TempData["success"] != null) { %>
      <div id="SuccessMessage"><%= Html.Encode(TempData["success"]) %><div>
<% } %>

【讨论】:

  • 如果你不想使用 Post/Redirect/Get 模式,你可以使用 ViewData 而不是 TempData 来保存值。我强烈推荐使用 Post/Redirect/Get...
  • 这很有意义。你在哪里学过这样的东西?
  • 在较新的 MVC 中,您可以对 ViewBag.Success 之类的东西做同样的事情
  • 请记住,TempData 使用 Session,并且在负载平衡环境中可能会出现问题。
【解决方案2】:

在验证所有验证并且一切正常执行之后,您应该实现类似 POST/Redirect/GET 模式并在操作方法结束时“重定向”到另一个视图。您可以将整个对象实例传递给目标视图,或者只传递纯文本消息,或者您可以从 web.config 或资源文件中提取目标视图本身中的文本。

例如,我在名为“ChangeSuccess.aspx”的共享文件夹中有一个视图,我将所有成功的编辑和创建都重定向到该视图。

你这样“重定向”

return View("ChangeSuccess", objectInstance);

(注意:实际上并不重定向,参见 cmets)

【讨论】:

  • 我几乎完全确定return View 不执行重定向,而是导致同一响应返回不同的内容。我想你的意思是return this.Redirect("new-url")return this.RedirectToAction(...)
  • 虽然这是一个老问题,但您的评论是正确的。上述行不执行重定向,而是使用指定的模型呈现不同的视图。
【解决方案3】:

我想您可以检查模型状态并在模型中设置一个变量...

public ActionResult MyAction(MyEntity model)
{
  //Here would be some validation, which returns with ModelState errors

  //Now set the validity of the modelstate as the IsValid property in your entity
  model.IsValid = ModelState.IsValid;

  return View(model);
}

在你看来……

<% if(Model.IsValid) { %>
  <p>You successfully transfered your balance to your ex.</p>
<% } %>

编辑:鉴于您更新的问题,我认为您正在考虑采取错误的方法。我会同意其他答案并关注PRG pattern。这绝对比尝试添加虚假错误更有意义。

【讨论】:

  • 嘿,丹,又来救我了。这只会给我一种可能的回应。我会改写这个问题。
  • 第一次访问页面时会显示成功消息吗?因为 ModelState 也会有效。
  • @Muflix 这是个好问题。上面的代码是针对POST 请求的,所以GET 请求不会命中此代码。此外,布尔值的默认值为false,因此除非您在第一个请求中明确将IsValid 设置为true,否则这应该不是问题。
猜你喜欢
  • 2014-09-14
  • 2019-04-19
  • 2011-11-15
  • 2017-10-01
  • 2015-11-02
  • 1970-01-01
  • 1970-01-01
  • 2023-03-18
  • 2023-04-06
相关资源
最近更新 更多