我试图在Orchard模块中进行不引人注意的客户端验证,但我遇到了问题.
在这个例子中,我只是尝试使用Html.TextBoxFor()在文本框字段上强制执行RequiredAttribute.
它看起来好像Orchard(LocalizedModelValidatorProvider)实现的自定义ModelValidatorProvider阻止了HTML5输入属性的呈现,具体来说:
data-val
data-val-required
Run Code Online (Sandbox Code Playgroud)
对于标准DataAnnotations RequiredAttribute.jQuery.validate.unobtrusive需要这些属性才能工作.
LocalizedModelValidatorProvider将RequiredAttribute映射到LocalizedRequiredAttribute,因此在渲染用LocalizedRequiredAttribute修饰的模型属性的文本框输入时,Orchard ViewEngine中的错误(或未实现的功能)可能是多少?
我怀疑这不会发生:
tagBuilder.MergeAttributes(htmlHelper.GetUnobtrusiveValidationAttributes(name, metadata));
Run Code Online (Sandbox Code Playgroud)
(来自System.Web.Mvc.Html.InputExtensions)
我目前正在运行Orchard 1.3.9.
注意:一个hacky解决方法是删除OrchardStarter模块中LocalizedModelValidatorProvider的注册,并默认返回标准MVC 3提供程序,尽管如果可能的话我不想打扰Orchard源(更不用说我可能需要本地化)消息在某些时候)......
jquery-validate orchardcms data-annotations unobtrusive-validation asp.net-mvc-3
TL; DR: F#编译器解释int在这种情况下为int操作者,如由Eugene Fotin确定和通过基因Belitski时膨胀.最佳解决方法是使用System.Int32.MaxValue或如下所述的唯一类型别名.
请考虑以下记录类型:
type User = {
Username : string
}
Run Code Online (Sandbox Code Playgroud)
我想要Username至少三个字符,所以我使用该StringLength属性.没有最大长度,所以我将它设置为int.MaxValue:
type User = {
[<StringLength(int.MaxValue, MinimumLength=3)>]
Username : string
}
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
这不是有效的常量表达式或自定义属性值.
如果我使用的话,一切都是桃子的System.Int32:
type User = {
[<StringLength(System.Int32.MaxValue, MinimumLength=3)>]
Username : string
}
Run Code Online (Sandbox Code Playgroud)
如果我别名它也会编译int:
type User = {
[<StringLength(num.MaxValue, MinimumLength=3)>]
Username : string
}
and num = int
Run Code Online (Sandbox Code Playgroud)
或完全符合类型:
type User = {
[<StringLength(Microsoft.FSharp.Core.int.MaxValue, MinimumLength=3)>] …Run Code Online (Sandbox Code Playgroud) 这是我的带有数据注释的Test类:
class Test
{
[Required, StringLength(10)]
public string MyProperty { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是我的控制台测试程序:
class Program
{
static void Main(string[] args)
{
var test = new Test {
MyProperty = "this is way more than 10 characters and should fail."
};
var context = new ValidationContext(test, null, null);
// No exception here! (why not?)
Validator.ValidateObject(test, context);
test.MyProperty = null;
// Exception here, as expected
Validator.ValidateObject(test, context);
}
}
Run Code Online (Sandbox Code Playgroud)
出于某种原因,当字符串长度太长时,我没有得到验证异常.当我将属性设置为null并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?
前段时间我问过这个问题:每个System.ComponentModel.DataAnnotations属性的目的是什么?
但是,我没有收到回复的运气.这个问题有点宽泛,因为它要求提供有关每个dataannotation属性的文档.此刻,我最感兴趣的是Association属性.
我正在使用ASP.NET MVC3和Entity Framework 4,并希望注释我的POCO.我在我的POCO中使用外键(不知何故感觉不对,但似乎通常是加入的).如何使用Association属性注释我的POCO ?我把它放在哪些属性(Association属性和/或外键属性)?有什么thisKey和otherKey参数.thisKey这个POCO 是关键还是这个POCO中的外键?
最后,什么会使用这个属性?ASP.NET MVC中有什么东西吗?
提前致谢!
我有一些关于自定义模型绑定,模型状态和数据注释的问题.
1)如果我的模型上有数据注释,那么在自定义模型绑定器中进行验证是否是多余的,因为这就是我认为数据注释的重点.
2)为什么我的控制器将模型状态视为有效,即使它不是,主要是我使Name属性为null或太短.
3)将自定义模型绑定器视为构造方法是否可以,因为这是他们提醒我的.
首先是我的模型.
public class Projects
{
[Key]
[Required]
public Guid ProjectGuid { get; set; }
[Required]
public string AccountName { get; set; }
[Required(ErrorMessage = "Project name required")]
[StringLength(128, ErrorMessage = "Project name cannot exceed 128 characters")]
[MinLength(3, ErrorMessage = "Project name must be at least 3 characters")]
public string Name { get; set; }
[Required]
public long TotalTime { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我使用自定义模型绑定器来绑定模型的某些属性.请不要介意它只是试图让它运行然后重构它是快速和肮脏的.
public class ProjectModelBinder : IModelBinder
{
public object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext) …Run Code Online (Sandbox Code Playgroud) validation asp.net-mvc modelbinders modelstate data-annotations
我正在尝试实现Validator.TryValidateProperty,即使有[Required] DataAnnotation,TryValidateProperty也会返回一个有效的响应.
这是我的客户部分类:
[MetadataType(typeof(Customer.Metadata))]
public partial class Customer : global::System.Data.Objects.DataClasses.EntityObject
{
...
private sealed class Metadata
{
[Required]
[SSNValidAttribute(ErrorMessage = "The SSN should be 9 numeric characters without any punctuation.")]
[DisplayName("SSN")]
public String SSN { get; set; }
...
Run Code Online (Sandbox Code Playgroud)
这是返回True的代码:
...
var customer = new Customer();
customer.SSN = "";
var vc = new ValidationContext(customer, null, null);
vc.MemberName = "SSN";
var res = new List<ValidationResult>();
var result = Validator.TryValidateProperty(customer.SSN, vc, res);
...
Run Code Online (Sandbox Code Playgroud) 我需要在MVC3页面上有一个复选框(用于同意条款).
这是我的模型:
[Required]
[Display("I agree to the terms.")]
public bool Agreement { get; set; }
Run Code Online (Sandbox Code Playgroud)
这是我的观点:
@Html.CheckBoxFor(m => m.Agreement)
Run Code Online (Sandbox Code Playgroud)
但是,验证没有发生 - 它允许无论如何都提交表单.
我发现CheckBoxFor渲染了一个额外的隐藏字段,但我甚至尝试渲染我自己的复选框,但它仍然没有得到验证:
<input type="checkbox" name="Agreement" id="Agreement" value="true" data-val="true"
data-val-required="You must agree to the terms before proceeding." />
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
我已经使用这里描述的方法来本地化我的数据注释消息,基本上它在正常形式的帖子中工作正常.我也可以在客户端看到本地化的验证消息.
但是,当我有一个部分视图具有要验证的输入字段并使用ajax调用加载时,会出现问题.出于某种原因,我得到了默认验证消息("此字段是必需的")而不是我在元素的data-val-required属性中设置的本地化消息.
我已经验证了以下内容:
1.我已经包含了"jquery.validate.min.js"和"jquery.validate.unobtrusive.min.js".
2.我检查了ajax响应,它确实包含带有本地化消息的data-val-required属性.
我已经尝试以下解决方案:
1.我试图解析Ajax响应(没有工作)为.validator.unobtrusive.parse $("形式")
所描述的验证2.解析动态内容在这里.仍然没有解决方案
我有一个迫切的截止日期,这让我很烦恼.
jquery data-annotations unobtrusive-validation asp.net-mvc-3
一直试图将服务器端DataAnnotation验证合并到我的项目中,我发现DataAnnotations有自己的错误类型ValidationException.但是,我的问题在于,它一次只返回一个验证错误,所以如果3个属性验证失败,则只抛出第一个.我正在寻找一种方法将所有错误作为异常抛出,因此它不会通知用户/开发人员验证失败,而是会一次性说明哪些属性/字段验证失败.
我找到了Validator.TryValidateObject(...)方法,但它只是填充ValidationResults并让开发人员选择是否抛出异常.我目前正在实现的是迭代ValidationResults以从中创建ValidationExceptions列表,将列表包装到AggregateException中,然后在其InnerExceptions中抛出另一个带有AggregateException的ValidationException.
ValidationContext validationContext = new ValidationContext(entity, null, null);
List<ValidationResult> validationResults = new List<ValidationResult>();
bool isValid = Validator.TryValidateObject(entity, validationContext, validationResults, true);
if (!isValid)
{
List<ValidationException> validationErrors = new List<ValidationException>();
foreach (ValidationResult validationResult in validationResults)
{
validationErrors.Add(new ValidationException(validationResult.ErrorMessage);
}
throw new ValidationException("Entity validation failed.", new AggregateException(validationErrors));
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,我的问题是:
我想在Controller中为我的模型设置一个默认值,但它无法在创建页面中显示.
TestModel代码:
public class TestModel
{
[DataType(DataType.DateTime), Required]
[DisplayFormat(DataFormatString = "yyyy/MM/dd", ApplyFormatInEditMode = true)]
public DateTime StartTime { get; set; }
[DataType(DataType.DateTime), Required]
[DisplayFormat(DataFormatString = "yyyy/MM/dd", ApplyFormatInEditMode = true)]
public DateTime EndTime { get; set; }
public string Description { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
控制器代码:
public ActionResult Create()
{
var model = new TestModel();
model.StartTime = DateTime.Now;
model.EndTime = DateTime.Now.AddDays(10);
model.Description = "This is a default value";
return View(model);
}
Run Code Online (Sandbox Code Playgroud)
查看页面:
<div class="form-group">
@Html.LabelFor(model => model.StartTime, htmlAttributes: new { @class …Run Code Online (Sandbox Code Playgroud) data-annotations ×10
validation ×4
asp.net-mvc ×3
c# ×3
.net ×2
f# ×1
jquery ×1
model ×1
modelbinders ×1
modelstate ×1
orchardcms ×1
poco ×1
razor ×1
ria ×1