我正在寻找一种方法来为Fluent验证实现不显眼的自定义验证.根据文档,它似乎并不表示它支持不显眼的验证.
同样适用于使用条件验证(When/unless).我在他们的MVC文档中看到,条件和其他复杂验证不支持不显眼的验证:
请注意,FluentValidation也适用于ASP.NET MVC的客户端验证,但并非所有规则都受支持.例如,使用条件(使用When/unless),自定义验证程序或对Must的调用定义的任何规则都不会在客户端运行.客户端支持以下验证器:
*NotNull/NotEmpty
*匹配(正则表达式)
*InclusiveBetween(范围)
*CreditCard
*电子邮件
*EqualTo(跨属性相等比较)
*长度
那么有没有人想出如何让这个工作?如果没有,是否有其他验证选项可以为不引人注目的自定义/复杂验证提供更好的支持?
asp.net-mvc fluentvalidation unobtrusive-validation asp.net-mvc-3
我正在使用ASP.NET MVC构建一个站点,并且正在使用jQuery validate unobtrusive库.我想知道是否有一种方法可以挂钩显示验证消息的事件,例如在用户输入无效内容的位置(与他们点击提交按钮的瞬间相反).
我想这样做的原因是因为我正在设置我的错误消息,如迷你弹出窗口,它出现在具有错误的字段上方 - 即使用绝对定位.由于单个字段可能具有各种不同的验证错误,我希望能够正确设置字段的位置以考虑消息的可变高度.我还需要处理这个事件,这样我就可以在输入元素周围应用一个红色边框的类.
当我在视图上只有一个模型实例时,远程验证工作正常.
问题是我的观点是处理模型的集合.这是我的模型:
public class TableFormTestModel
{
public GridRow[] GridData { get; set; }
public class GridRow
{
public Int32 Id { get; set; }
[Required, StringLength(50), Remote("IsNameAvailable", "TableFormTest", "Admin", AdditionalFields = "Id")]
public String Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
在我看来,我有:
@model TableFormTestModel
@using (Html.BeginForm())
{
Html.EnableClientValidation();
Html.EnableUnobtrusiveJavaScript();
for(var i = 0;i<Model.GridData.Length;i++)
{
<div>
@Html.HiddenFor(x => Model.GridData[i].Id)
@Html.TextBoxFor(x => Model.GridData[i].Name)
@Html.ValidationMessageFor(x => Model.GridData[i].Name)
</div>
}
}
Run Code Online (Sandbox Code Playgroud)
生成表单有很长的路要走,有人可以为我改进语法吗?
生成以下html表单:
<form method="post" action="/Admin/TableFormTest/"> <div>
<input type="hidden" value="1" name="GridData[0].Id" id="GridData_0__Id" data-val-required="The Id …Run Code Online (Sandbox Code Playgroud) 有没有办法在将数据提交到远程方法之前以及从远程方法返回结果之后,在客户端上挂接MVC3不显眼的远程验证?
我试图告诉远程验证器仅在单击提交按钮时执行验证.正常行为是多次验证,例如在按键,模糊等过程中.这是不好的,因为有问题的验证方法需要调用非幂等操作.我需要确保只有在用户单击了提交按钮时才调用该方法.
如果我可以挂钩到before事件,我可以在表单中设置一个字段,将提交按钮标记为是否被点击.但是,在远程方法返回验证结果后,我需要重置此标志.
还有其他建议吗?这是用于使用ASP.NET成员资格提供程序的Membership.ValidateUser(string username, string password)方法验证密码.FailedPasswordAttemtCount每次发送无效密码时此方法都会递增,所以我不希望它在模糊,按键等期间执行.
asp.net-mvc jquery-validate unobtrusive-validation asp.net-mvc-3 remote-validation
我一直有一个让我绝对疯狂的奇怪问题.
在它工作得很好之后,它开始出现以下错误:
Validation type names in unobtrusive client validation rules must be unique. The following
validation type was seen more than once: required
Run Code Online (Sandbox Code Playgroud)
此错误首先在Area/Admin/WebSites中的一个控制器上启动.但是一旦我的身份验证cookie过期,我就会在我的登录页面上以及EditFor(m => m.UserName)行中获得它.我梳理了我的代码,在任何可能被远程命名相同的模型上的任何地方查找重复的必需属性,但无济于事.
我甚至进入了我的LoginViewModel,删除了[Required] From UserName.错误移至EditFor(m => m.Password).我也从密码中删除了必需,并且错误移动了RememberMe行,但该成员上根本没有必需属性.事实上,我在其他任何类别的任何地方都没有其他名称甚至远程命名为RememberMe.
好吧,我放弃并开始从头开始重建webSite项目(不是解决方案的其余部分),但最终还是得到了同样的东西.
绝望之下,我从头开始重建整个解决方案,只复制*.cs文件并手动重新加载所有引用,认为某处存在重复引用.
一旦我再次建立MVC4项目,我就分阶段进行,看看能否知道发生了什么.它做得很好,加载,我可以登录等,直到我开始添加区域.起初我只是将Areas文件夹直接复制到项目中(所有命名空间名称都相同,所以这应该没问题).但果然我开始正确地得到这个错误.
好的,所以我开始按照我最初创建它们的相反顺序删除控制器.在我完全删除了Areas文件夹之前,该网站从未恢复正常.
测试一下,一旦我在项目中创建了一个Areas文件夹,它就会破坏.如果我使用GUI创建新区域也是如此.
好的,回到绘图板.从头开始重新创建MVC4项目,这次是在解决方案之外,并且只提供了对我的解决方案至关重要的2个关键NuGet包:Ninject.MVC3和Mvc3ControlsKit(来自nuget的一个用于3和4).好的,一切都终于开始了.此时,我的Jquery是版本1.7.2,带有MVC4附带的默认Jquery UI.
在某些时候,我遇到了jquery对话框未关闭的问题所以我从NuGet安装了JQuery 1.8.2和最新的JQuery UI.一切正常,直到我在管理区域添加一个完全空白的控制器,然后再次弹出此错误.
好的,再次回到绘图板......我分阶段重建它,在每个点进行测试.这次没有安装最新的JQuery好东西.一切都恢复正常.添加了一个新控制器,然后是两个.好的,制作了这个版本的有效副本并将其放在一边.将Jquery和Jquery UI更新到最新版本.在该区域添加一个新的控制器,它仍然继续完全沮丧.
我的实体都使用Fluent API配置我的实体,根本没有DataAnnotatian属性.有任何想法吗?我一直在等待它再次破裂.
编辑:
以下是我刚才想到的更多信息.我的LogIn Partial View中的这行代码出现错误.我的模特是
public class LoginViewModel
{
[Required]
[Display(Name = "User Name")]
public string UserName { get; set; }
[Required]
[DataType(DataType.Password)]
[Display(Name = "Password")]
public string Password { get; set; }
[Display(Name = "Remember …Run Code Online (Sandbox Code Playgroud) 我一直在努力弄清楚为什么没有触发ValidationController动作.
我在项目范围的web.config中启用了设置:
<add key="ClientValidationEnabled" value="true" />
<add key="UnobtrusiveJavaScriptEnabled" value="true" />
Run Code Online (Sandbox Code Playgroud)
我有以下控制器:
[OutputCache(Location = OutputCacheLocation.None, NoStore = true)]
public class ValidationController : Controller
{
private readonly IUserRepository userRepository;
public ValidationController(IUserRepository userRepository)
{
this.userRepository = userRepository;
}
public JsonResult IsUserNameAvailable(string username)
{
User user = userRepository.Get(u => u.UserName == username);
if (user == null) return Json(true, JsonRequestBehavior.AllowGet);
else return Json(false, JsonRequestBehavior.AllowGet);
}
}
Run Code Online (Sandbox Code Playgroud)
和以下viewmodel:
[Required(ErrorMessage = "Required *")]
[StringLength(50, MinimumLength = 4, ErrorMessage = "Please keep the username between four and twenty …Run Code Online (Sandbox Code Playgroud) jquery-validate unobtrusive-validation remote-validation asp.net-mvc-4
我创建了以下自定义RegularExpressionAttribute
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class AlphaNumericAttribute: RegularExpressionAttribute, IClientValidatable
{
public AlphaNumericAttribute()
: base("^[-A-Za-z0-9]+$")
{
}
public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
yield return new ModelClientValidationRule { ErrorMessage = FormatErrorMessage(metadata.GetDisplayName()), ValidationType = "alphanumeric" };
}
}
Run Code Online (Sandbox Code Playgroud)
ViewModel中的字段使用我的AlphaNumeric属性进行修饰:
[AlphaNumeric(ErrorMessageResourceType = typeof(Resources), ErrorMessageResourceName = Resources.DriverLicenseNumber_RegexError_)]
public string DriverLicenseNumber { get; set; }
Run Code Online (Sandbox Code Playgroud)
该字段构建在视图中:
@using (Html.BeginForm("Index", "Application", FormMethod.Post, new { id = "applicationDataForm", autocomplete = "off" }))
{
@Html.LabelFor(m => m.DriverLicenseNumber)
@Html.ValidationMessageFor(m => m.DriverLicenseNumber)
@Html.TextBoxFor(m => m.DriverLicenseNumber)
}
Run Code Online (Sandbox Code Playgroud)
这应该在我的html输入标记上产生适当的 …
data-annotations unobtrusive-validation asp.net-mvc-3 asp.net-mvc-4
关于这里的帖子,一旦他们被展示和解决后如何删除这些错误?
我通过以下方式添加了错误:
var errorArray = {};
errorArray["Slug"] = 'Some error message for the Slug text box';
$('#SomeFormId').validate().showErrors(errorArray);
Run Code Online (Sandbox Code Playgroud)
但是我无法在表单的ajax帖子之后清除错误.
我有一个模特:
public class MyModel{
[Phone]
public string MyTel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在视图中:
@model MyModel
@Html.EditorFor(x => x.MyTel)
Run Code Online (Sandbox Code Playgroud)
生成的HTML:
<input type="tel" value="" name="MyTel" id="MyTel" data-val-phone="The MyTel field is not a valid phone number." data-val="true" class="text-box single-line"/>
Run Code Online (Sandbox Code Playgroud)
MyTel字段的客户端验证不起作用.如何使这项工作?
javascript forms asp.net-mvc data-annotations unobtrusive-validation
我有一个ASP.NET项目,它使用jQuery.Validate和ASP.NET构建的不显眼的包装器自动连接客户端验证.
a)我肯定有相应的库:jquery.js,jquery.validate.js和jquery.validate.unobtrusive.js
b)明确打开MVC渲染引擎(ClientValidationEnabled&UnobtrusiveJavaScriptEnabled在appSettingsweb.config部分)
这是一个简单的例子,其中的事情被打破:
型号:
public class Person
{
[Required]
public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器:
public ActionResult Edit()
{
Person p = new Person();
return View(p);
}
Run Code Online (Sandbox Code Playgroud)
查看:
@model validation.Models.Person
@using (Html.BeginForm()) {
@Html.ValidationSummary(false)
@Html.LabelFor(model => model.Name)
@Html.EditorFor(model => model.Name)
}
Run Code Online (Sandbox Code Playgroud)
这会生成以下客户端标记:
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.4/jquery.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery-validate/1.15.1/jquery.validate.js"></script>
<script type="text/javascript" src="https://ajax.aspnetcdn.com/ajax/mvc/3.0/jquery.validate.unobtrusive.js"></script>
<form action="/Person" method="post">
<div class="validation-summary-valid" data-valmsg-summary="true">
<ul><li …Run Code Online (Sandbox Code Playgroud)