4

我正在使用Validation.Add()Html.TextBox()(和相关的)帮助程序以及不显眼的 JavaScript 错误检查,并且对结果非常满意。它用一组代码覆盖了服务器端和客户端,通常我已经能够实现我需要的一切。

我遇到了一些障碍,因为在某些时候您需要运行自己的逻辑来建立错误案例。如果此错误直接与某个字段相关,最好手动将该字段标记为带有任意错误消息的错误源 - 我相当确定没有办法开箱即用。为了澄清我的意思,一个例子是一个用户名字段,它需要检查用户名是否已经在使用 - 如果是,则会生成错误。

目前,我正在使用 将其添加到表单错误集合中Validation.AddFormError(),该方法有效,但仅在摘要中显示错误。看到,在上面的例子中,错误显然与用户名字段有关,能够将该错误与适当的字段名称联系起来(并将其显示在正确的位置)似乎是合乎逻辑的。

我应该只从 派生并制作一个仅返回RequestFieldValidatorBase的验证器吗?显然,作为服务器端检查,我不希望在客户端检查它,尽管我知道通过为验证系统编写更具体的验证器和插件、公开更多属性并执行 AJAX 也是可能的查看。我对这个问题感兴趣的是一个更通用的解决方案:将特定字段标记为服务器端错误的来源。falseIsValid()data-

希望这是有道理的。人们会推荐什么作为解决这个问题的最佳方法?

4

2 回答 2

3

很抱歉死灵法师的回答,但我最近碰到了这个,我找到了一个更简单的解决方案。ModelStateDictionary本机支持此功能。只需使用ModelState代替,Validation您就不再需要自定义验证器、初始化方法或任何其他工件;一切都烤好了:

在特定表单元素上触发验证

if (!usernameIsValid)
{
    ModelState.AddError("username", "That username is already taken.");
}

ModelState 还允许您添加表单范围的验证错误消息,就像验证一样:

在整个表单上触发验证

if (password != confirmation)
{
    ModelState.AddFormError("Password and confirmation password do not match.");
}

这种方法的另一个优点是它ModelState适用于 ASP.NET 网页ASP.NET MVC。另一方面,Validation它是 ASP.NET 网页专有的,如果您希望将项目迁移到 MVC,这可能会使事情变得复杂。

资源

于 2015-05-03T11:33:19.603 回答
0

我想我会回来发布我最终实施的内容,以防它可能对其他人有所帮助,或者以防有人可以提出任何改进建议。

我添加了一个我命名的自定义验证ThrowApp_Code

public class Throw : RequestFieldValidatorBase
{
    public Throw(string errorMessage)
        : base(errorMessage)
    { }

    protected override bool IsValid(System.Web.HttpContextBase httpContext, string value)
    {
        return false;
    }
}

然后为其添加了一个初始化方法,以便我可以以与内置验证器相同的方式创建它们的内联实例(也添加到App_Code):

public static class CustomValidator
{
    public static Throw Throw(string errorMessage)
    {
        return new Throw(errorMessage);
    }
}

然后在我的内容页面中,我可以执行以下操作:

if (!usernameIsValid)
{
    Validation.Add("username", CustomValidator.Throw("That username is already taken."));
}
于 2013-11-08T09:05:33.153 回答