我一直在使用xVal框架进行一些开发,以便在服务器端链接模型的一些验证规则,以及使用jQuery Validation插件和用于提交表单的jQuery Form插件的一些客户端验证.
但是,我在将它们连接在一起时遇到了问题.
我正在努力实现以下目标:
允许客户端使用通过调用rules("add", options")jQuery Validation的插件定义的规则来执行基本验证(这是xVal用于获取模型上服务器端定义的规则的内容).
如果客户端验证成功,则调用服务器以再次输入执行验证的表单数据(在客户端上验证的项目,以及无法在客户端中执行的任何其他验证).
让服务器返回JSON中的对象,该对象指示可能具有特定字段的任何错误,然后设置字段的错误显示.
我通过以下方式调用xVal,在ASP.NET MVC页面中设置了插件的元数据:
<%= Html.ClientSideValidation<Model>("model") %>
Run Code Online (Sandbox Code Playgroud)
这转化为客户端的以下内容:
<script type="text/javascript">
xVal.AttachValidator("model",
{
"Fields":
[
{
"FieldName":"title",
"FieldRules":
[
{
"RuleName":"Required",
"RuleParameters":{}
},
{
"RuleName":"StringLength",
"RuleParameters":
{
"MaxLength":"250"
}
}
]
},
{
"FieldName":"body",
"FieldRules":
[
{
"RuleName":"Required",
"RuleParameters":{}
}
]
}
]
}, {})
</script>
Run Code Online (Sandbox Code Playgroud)
上面的内容实际上只是转换为rules("add", options)jQuery验证器插件然后处理的一系列调用.
但是,当尝试通过jQuery表单发布此表单时,验证不会发生在表单值上.表单提交,但值根本没有验证.
如何使用jQuery Form插件提交表单,同时通过调用jQuery Validation插件进行验证ajax?
我想通过正则表达式验证器截取表单字段中的"<"字符.我将分三个步骤描述问题:
第1步:当我尝试提交一个包含"<"字符的字段的表单时,我得到了"潜在危险请求..." - 正如ASP.NET中预期的那样.
第2步:为了避免ASP.NET的RequestValidation,我使用"[ValidateInput(false)]"在控制器中修饰我的Update方法.
它按预期工作 - 现在我可以毫无错误地发布"<"字符.
第3步:我将xVal与DataAnnotations一起使用.例如,[Required]或[StringLength(255)]按预期工作.
但是当我使用时:[RegularExpression("^ [^ <>]*$",ErrorMessage ="不允许使用特殊字符.")],我再次收到"潜在的dangeros请求..."错误,尽管[ValidateInput] (假)]指令.
发生了什么?有没有更简单的正则表达式验证方法,但是[ValidateInput(false)]到位了吗?当然,我想在模型中使用验证码,而不是在控制器中.
当我在Asp.Net MVC中进行字段验证时,它生成了以下错误css类:
有没有办法可以更改生成的错误类的名称?
我用xVal.
我正在尝试为新的ASP.NET MVC项目决定采用哪种验证方法.(哇有很多选择!)
该项目使用NHibernate,因此我首先考虑的是NHibernate Validator(因为与NHibernate的紧密集成).但是,据我所知,这种紧密集成只有几个好处:
1)NHibernate生成的DB Schema将包含验证的详细信息(例如,列长度将设置为验证中允许的最大值).(但我并不感兴趣,因为我手动生成模式.)
2)如果您尝试保存不符合验证规范的数据,NHibernate将抛出异常.(这对我来说似乎是多余的,因为数据可能已经通过您在保存前选择的任何机制进行验证)
如果NHibernate Validator有更多好处,请告诉我!
我一直在阅读的其他图书馆包括:
我也一直在考虑使用xVal从同一组规则中提供客户端验证.但是,我听说ASP.NET MVC v2会包含类似于xVal(与jquery集成)的东西吗?这个新的功能是否会使其他一些功能变得多余?
所以,我基本上要求人们就这方面的方向提出建议.我不想实施一个特定的方案,只有当另一个成为主导技术时才必须将其撕掉.
什么对你有用?你认为哪个选项有/将有优势?
谢谢!
validation asp.net-mvc xval nhibernate-validator data-annotations
当我开始使用xVal进行客户端验证时,我只实现了使用域模型对象作为viewmodel或viewmodel中这些对象的嵌入实例的操作方法.
这种方法在大多数情况下都能正常工作,但有时候视图需要显示和回发模型属性的一个子集(例如,当用户想要更新他的密码,而不是他的其他配置文件数据时) .
一个(丑陋的)解决方法是在表单上为每个属性设置一个隐藏的输入字段,该字段在表单上不存在.
显然,此处的最佳做法是创建一个自定义视图模型,该视图模型仅包含与视图相关的属性,并通过Automapper填充视图模型.它更清晰,因为我只传输与视图相关的数据,但它远非完美,因为我必须重复已经存在于域模型对象上的相同验证属性.
理想情况下,我想通过MetaData属性将域模型对象指定为元类(这通常也称为"伙伴类"),但这不起作用,因为当元数据类具有属性时,xVal会抛出视图模型中不存在.
这有什么优雅的解决方法吗?我一直在考虑攻击xVal源代码,但也许还有其他方法我到目前为止忽略了.
谢谢,
阿德里安
编辑:随着ASP.NET MVC 2的到来,这不仅仅是与验证属性相关的问题,而且它也适用于编辑器和显示属性.
我的解决方案有这些项目:
DAL,BL和WEB都参考了很棒的DTO.
该过程通常以这种方式执行:
我的DTO能够根据自己的状态(属性值)验证自己.但是现在我遇到了问题,但事实并非如此.我需要他们使用BL(以及因此DAL)进行验证.
我的现实生活中的例子:用户注册和WEB获得验证的用户DTO.有问题的部分是username验证.应根据数据存储检查其唯一性.
我该怎么做?
还有其他信息表明所有DTO都实现了IoC和TDD 的接口(即UserDTO实现IUser).两者都是DTO项目的一部分.
Compilation errorPartial classes can't span assemblies.ActionFilter,可以根据外部条件验证对象.这个将在WEB项目中创建,因此可以看到将在此处使用的DTO和BL.输入验证的常见做法是什么?换句话说,您是在客户端,服务器端还是双方检查输入验证?
此外,如果性能对我来说至关重要,那么客户端输入验证是否足以支持我的网站而不会带来任何安全风险?
我有一个应用程序,我已经成功使用xVal很长一段时间了.它最近更新为MVC 2.
我在我的域模型上使用标准的DataAnnotations属性,它还实现了一个调用DataAnnotationsValidationRunner的"Validate()"方法.如果有任何错误,该方法将抛出RulesException.
在我的控制器中,我使用了RulesException的非常典型的catch
catch (RulesException e)
{
e.AddModelStateErrors(ModelState, "err");
}
Run Code Online (Sandbox Code Playgroud)
所有典型的东西,几乎直接来自示例,直到最近工作正常(我怀疑问题始于我的MVC1 - > MVC2更新.
所以问题是:当调用AddModelStateErrors方法时,我1.get_Count() at System.Web.Mvc.Html.ValidationExtensions.ValidationMessageHelper(HtmlHelper htmlHelper, ModelMetadata modelMetadata, String expression, String validationMessage, IDictionary在System.Web.Mvc 收到一个"System.EntryPointNotFoundException:找不到入口点",它来自System.Collections.Generic.ICollection 2 htmlAttributes) ASP.views_user_edit_aspx.上的.Html.ValidationExtensions.ValidationMessage(HtmlHelper htmlHelper,String modelName,String validationMessage,IDictionary`2 htmlAttributes.)_ RenderContent2 ... {snipped,因为它是那里的标准}
我已经查看了xVal方法的代码和HtmlHelper扩展,我似乎无法弄清楚发生了什么.
有任何想法吗?
有很多非常好的帖子和解释如何使用ASP.NET MVC实现验证,我更喜欢其中一个:
但是,我真的想通过jquery $ .ajax方法调用ActionMethods.我想使用$ .ajax的原因之一是因为会有很多部分视图通过$ .ajax调用动态地加载到页面中(甚至是实体创建的形式),我不能只返回视图 - 我将丢失所有动态加载的内容.
为了让您更好地了解问题,我将发布一些简单的代码来解释我如何在客户端jquery代码中调用控制器操作和处理响应.
控制器ActionMethod:
public ActionResult CreateCustomer(string name, string accountNumber)
{
try
{
CustomerService.InsertCustomer(name, accountNumber);
return Json(new ActionInfo()
{
Success = true,
Message = "Customer Is Successfully Created"
});
}
catch (Exception ex)
{
return Json(new ActionInfo()
{
Success = false,
Message = ex.Message
});
}
}
Run Code Online (Sandbox Code Playgroud)
在客户端代码中调用和处理:
$.ajax({
type: "POST",
url: $form.attr('action'),// /MyController/CreateCustomer
data: $form.serialize(),
error: HandleUnespectedError,
dataType: "json",
success: function(response) {
if (response.Success)
alert("Success: " + response.Message);
else …Run Code Online (Sandbox Code Playgroud) xval ×10
validation ×9
asp.net-mvc ×7
asp.net ×2
jquery ×2
ajax ×1
architecture ×1
automapper ×1
javascript ×1
webforms ×1