从控制器asp.net mvc 5

时间:2017-04-22 15:46:42

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

我是网络开发的新手并且正在尝试学习ASP.Net MVC 5.我在数据库中查找一条记录,如果找不到记录,那么我想向用户显示错误消息。以下是我的尝试:

控制器

    [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; }
}

但我在某处读到我应该在我的视图模型中放置一个属性并在该属性上设置错误消息。我现在很困惑,如何实现它以及如何在View中显示错误?哪一个是推荐/最佳实践?

5 个答案:

答案 0 :(得分:33)

  

但我在某处读到我应该在我的视图模型中放置一个属性   并在该属性上设置错误消息。我现在很困惑,怎么样   实现这一点以及如何在View中显示错误?哪一个   是推荐/最佳做法?

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

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Search(ForgotPasswordMV viewModel)
{
    // ... 
    else
    {
        ModelState.AddModelError("Email", "Email not found or matched");
        return View(viewModel);
    }
}

然后在您的视图中添加电子邮件字段旁边的行;

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

答案 1 :(得分:3)

  

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

这是对的。您可以将错误消息添加到视图模型中:

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>

所以基本上我们正在用强类型视图模型替换ViewBag的使用。

答案 2 :(得分:1)

至于我接受anwser不是最好的做法。我们可以处理注释中的所有错误 在我们的ViewModel中,我们为我们的专业人员指定了ErrorMessage

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)

答案 3 :(得分:0)

如果有人正在寻找一个简单的解决方案,并且没有永久性,那么可以随意使用此答案,因为这对我有所帮助。如果您必须担心应用程序内的安全性,请不要使用此修补程序。

在您的控制器中:

TempData["Message"] = "This is my Error";

在您的Error.cshtml文件中:

<h3><strong>@TempData["Message"]</strong></h3>

结果:

enter image description here

答案 4 :(得分:0)

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

        if (UnitCount >= 1000)
        {
            TempData["MsgChangeStatus"] = "Only 1000 units are allowed to modify at the same time!";
            return RedirectToAction("ChangeStatus");
        }

非常重要,在使用TempData命令之后,必须使用Return View()或立即返回RedirectToAction(),因为这些命令可以将您的消息发送到View。

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

 @{
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>