C# 从控制器asp.net mvc 5在视图上显示错误消息

C# 从控制器asp.net mvc 5在视图上显示错误消息,c#,asp.net,asp.net-mvc,asp.net-mvc-5,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,我是一名网络开发新手,正在努力学习ASP.NETMVC5。我正在数据库中查找一条记录,如果未找到该记录,则我希望向用户显示一条错误消息。以下是我的尝试: 控制器 [HttpGet] public ActionResult Search() { return View(); } [HttpPost] [ValidateAntiForgeryToken] public ActionResult Search(ForgotPas

我是一名网络开发新手,正在努力学习ASP.NETMVC5。我正在数据库中查找一条记录,如果未找到该记录,则我希望向用户显示一条错误消息。以下是我的尝试:

控制器

    [HttpGet]
    public ActionResult Search()
    {
        return View();
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Search(ForgotPasswordMV viewModel)
    {
        if (Temp.Check(viewModel.Email))
            return RedirectToAction("VerifyToken", new { query = viewModel.Email });
        else
        {
            ViewBag.ErrorMessage = "Email not found or matched";
            return View();
        }
    }
查看:

<p>@ViewBag.ErrorMessage</p>
但我在某个地方读到,我应该在视图模型中放置一个属性,并在该属性上设置错误消息。我现在很困惑,如何实现这一点,以及如何在视图中显示错误?推荐/最佳实践是哪一种

但我在某个地方读到,我应该在视图模型中放置一个属性,并在该属性上设置错误消息

没错。您可以将错误消息添加到视图模型中:

public class ForgotPasswordMV
{
    [Display(Name = "Enter your email"), Required]
    public string Email { get; set; }

    public string ErrorMessage { get; set; }
}
然后在视图模型上设置此属性,并将视图模型传递给视图:

...
else
{
    viewModel.ErrorMessage = "Email not found or matched";
    return View(viewModel);
}
最后,在强类型视图中,在模型上使用属性:

@model ForgotPasswordMV
...
<p>@Model.ErrorMessage</p>
@型号ForgotPasswordMV
...
@Model.ErrorMessage

因此,这里我们基本上用强类型视图模型取代了
ViewBag
的使用

但我在某个地方读到,我应该在视图模型中放置一个属性 并在该属性上设置错误消息。我现在很困惑,怎么办 那么,如何在视图中显示错误呢?哪一个 推荐/最佳做法是什么

最佳做法是更改控制器的
ModelState
dictionary属性,如下所示:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Search(ForgotPasswordMV viewModel)
{
    // ... 
    else
    {
        ModelState.AddModelError(nameof(ForgotPasswordMV.Email), "Email not found or matched");
        return View(viewModel);
    }
}
然后在您的视图中,在您的电子邮件字段旁边添加下面的行

@Html.ValidationMessageFor(m => m.Email)

对我来说,接受anwser不是最好的做法。我们可以处理批注中的所有错误。
在我们的视图模型中,我们为属性指定
ErrorMessage
s

public class UserLoginViewModel
{
    [Required(ErrorMessage = "User name is required")]
    [Display(Name = "User name")]
    [StringLength(500, ErrorMessage = "User name is too short", MinimumLength = 3)]
    public string Login { get; set; }

    [Required(ErrorMessage = "Password is required")]
    [Display(Name = "Password")]
    public string Password { get; set; }
}
在我们的控制器中

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Login(UserLoginViewModel model)
{
    if (!this.ModelState.IsValid)
    {
        return this.View();
    }
    ...
}
以及我们的看法

@Html.ValidationMessageFor(model => model.Login)
@Html.EditorFor(model => model.Login)
@Html.ValidationMessageFor(model => model.Password)
@Html.EditorFor(model => model.Password)

如果有人正在寻找一个简单的解决方案,没有什么比这更持久的了,请随意使用这个答案,因为它帮助了我。如果您必须担心应用程序中的安全性,请不要使用此修复程序

在控制器中: 在Error.cshtml文件中:
@TempData[“Message”]
结果:

我也花了很多时间来寻找最好的解决方案。这很简单。在控制器中可以发送这样的消息

        if (UnitCount >= 1000)
        {
            TempData["MsgChangeStatus"] = "Only 1000 units are allowed to modify at the same time!";
            return RedirectToAction("ChangeStatus");
        }
非常重要的是,在使用TempData命令后,必须立即使用Return View()或Return RedirectToAction(),因为这些命令可以将消息发送到视图

视图中,您必须添加以下部分

 @{
ViewBag.Title = "UnitState Change";
Layout = "~/Views/Shared/_Layout.cshtml";
var message = TempData["MsgChangeUS"] ?? string.Empty;
}


<script type="text/javascript">
var message = '@message';
if(message)
    alert(message);
</script>
@{
ViewBag.Title=“美国变化”;
Layout=“~/Views/Shared/_Layout.cshtml”;
var message=TempData[“MsgChangeUS”]?字符串。空;
}
var message='@message';
如果(信息)
警报(信息);

这是推荐的做法吗?如果你不得不这么做,你会怎么做?modelview中的Viewbag或属性?您能否看到下面的答案,并让我知道这是否是使用helper的最佳实践methods@DarinDimitrov我已经试过了,但是我在页面加载时得到了一个NullReferenceException?我喜欢这个解决方案,因为它使用Html帮助程序,所以我不需要处理其他事情。所以我应该遵循这种方法作为最佳实践。但这个问题的另一个答案更倾向于将error属性添加到模型中。你能解释一下ModelState.AddModelError实际上在做什么吗。我知道如果我们将一个字段设置为
[Required]
,然后检查
modelstate.isvalid
,那么我们可以在那里捕获错误。这是
AddError
在引擎盖下做同样的事情,但它更定制吗?是的,这是准确的。这是最佳实践,因为假设您的模型上有许多属性,那么最终将为每个模型属性创建许多错误消息属性,从而使模型膨胀。使用
ModelState.AddModelError
有助于避免这种情况。有一点我注意到,KeyName应该与属性名相同,这样它就可以绑定到特定的属性。因此,基本上
AddModelError
中的第一个参数告诉我们需要将此错误消息绑定到模型中的哪个属性。如果我错了,请纠正我。但无论如何,谢谢你的回答对您还可以将空字符串作为键,以便将带有的错误消息绑定到整个模型。如果您使用thiat解决方案,您必须使用这一行
@Html.ValidationSummary(true,“发生了以下错误:”)
@CodeNotFound,我也遇到过类似的情况,您的解决方案对我很有吸引力。非常感谢!!这里我们讨论的是来自业务逻辑的错误,而不是标准的错误。因此,远程验证可能对某些人有用。您还可以使用RV检查电子邮件匹配/查找。
<h3><strong>@TempData["Message"]</strong></h3>
        if (UnitCount >= 1000)
        {
            TempData["MsgChangeStatus"] = "Only 1000 units are allowed to modify at the same time!";
            return RedirectToAction("ChangeStatus");
        }
 @{
ViewBag.Title = "UnitState Change";
Layout = "~/Views/Shared/_Layout.cshtml";
var message = TempData["MsgChangeUS"] ?? string.Empty;
}


<script type="text/javascript">
var message = '@message';
if(message)
    alert(message);
</script>