【问题标题】:How to show ModelState validation messages to the user on the initial GET如何在初始 GET 上向用户显示 ModelState 验证消息
【发布时间】:2014-12-19 14:58:21
【问题描述】:

好的,所以我为之工作的人希望表单验证消息在初始加载时立即显示。在我的 ViewModel 中,我有我所有的要求等...通常会在 POST 上被击中,那么我如何强制在 GET 上进行验证,以便用户在他们第一次输入表单时看到这些验证消息?

我试过了

ValidateModel(viewModel);

TryValidateModel(viewModel)

但这些都不起作用。那么有没有简单的方法呢?

所以我有这样的事情:

[HttpGet]
public ActionResult Index()
{
    var viewModel = new RandomVieModel();

    ValidateModel(viewModel); //For example

    return View(viewModel);
}

[HttpPost]
public ActionResult Index(RandomViewModel viewModel)
{
    if(!ModelState.IsValid)
    {
        return View(viewModel);
    }

    return RedirectToAction("SomethingNew);
}

这是我的视图模型的示例:

public class RandomViewModel
{
    [MaxLength(100)]
    [MinLength(3)]
    public string SomeRandomText { get; set; }

    [Required]
    public string RandomName { get; set; }
}

【问题讨论】:

  • 你从哪里得到这些方法的?您在哪里以及如何尝试这些方法?
  • 它们来自 System.Web.Mvc,我只是在返回控制器中的视图之前尝试过它们
  • 愚蠢的问题,但是您的 viewModel 类确实具有数据注释属性,对吗?
  • 是的,确实如此。我将在上面为您举一个例子。但它适用于 POST。我只想让它在 GET 上工作。
  • TryValidateModel 做了你为我描述的事情......

标签: c# validation modelstate


【解决方案1】:

验证消息在初始 GET 中会包含什么内容?由于还没有“失败”(因为那些在 POST 上得到验证),所以不会有验证消息? (用户没有提供任何输入?)

如果您使用验证消息来指导用户应该如何提供值(“请输入字母数字邮政编码”),那么您确实不应该使用验证消息。那是应该永远存在的文本。如果您希望避免重复相同的文本消息,请使用资源文件。

如果这是暂时的(而且您已经知道),那么您所做的任何事情都将是一个黑客行为。将它添加到您的 HTML 或更改您的控制器,以便它始终检查模型的有效性:

public ActionResult Index(RandomViewModel viewModel)
{
    if (!ModelState.IsValid)
    {
        return View(viewModel);
    }

    if (Request.HttpMethod == HttpMethod.Post) 
    {
       return RedirectToAction("SomethingNew");
    } 
    else 
    {
       return View(viewModel);
    }

}

以上将是您的 GET 和 POST 操作方法。

【讨论】:

  • 就是这样。我的客户希望它立即失败。这就是我想要发生的事情。 (尽管它可能很愚蠢)。所以基本上我希望 POST 上发生的事情发生在 GET 中,以便显示错误消息。
  • 然后总是在您的 HTML 中显示文本。就像写出来一样。你不需要用它来装饰你的视图模型。将其移至您的 HTML。
  • 这不是永久性的。如果是,我们会那样做。但这只是几个月的事情。我只是在寻找一个“有希望”的简单解决方案来强制在 GET 上触发 viewmodel 验证
【解决方案2】:

好的,所以我找到了一个临时解决方案。幸运的是,它不是永远的。

所以我发现 jquery validate 是一个不错的选择。它将在客户端触发验证。

<script type="text/javascript">
    $(document).ready(function () {
        $('#form-id').validate().form();
    });
</script>

【讨论】:

    猜你喜欢
    • 2012-06-11
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2017-09-02
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    相关资源
    最近更新 更多