标签: data-annotations

Orchard CMS DataAnnotations - 客户端验证

我试图在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

10
推荐指数
1
解决办法
1452
查看次数

F#int.MaxValue是"不是有效的常量表达式",但System.Int32.MaxValue是?

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)

.net f# data-annotations

10
推荐指数
2
解决办法
2962
查看次数

StringLengthAttribute似乎不起作用

这是我的带有数据注释的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并重新验证时,我确实得到了验证异常(如预期的那样).我的字符串长度注释没有被强制执行的任何想法?

validation ria data-annotations

9
推荐指数
1
解决办法
3988
查看次数

我如何使用System.ComponentModel.DataAnnotations.AssociationAttribute

前段时间我问过这个问题:每个System.ComponentModel.DataAnnotations属性的目的是什么?

但是,我没有收到回复的运气.这个问题有点宽泛,因为它要求提供有关每个dataannotation属性的文档.此刻,我最感兴趣的是Association属性.

我正在使用ASP.NET MVC3和Entity Framework 4,并希望注释我的POCO.我在我的POCO中使用外键(不知何故感觉不对,但似乎通常是加入的).如何使用Association属性注释我的POCO ?我把它放在哪些属性(Association属性和/或外键属性)?有什么thisKeyotherKey参数.thisKey这个POCO 是关键还是这个POCO中的外键?

最后,什么会使用这个属性?ASP.NET MVC中有什么东西吗?

提前致谢!

poco entity-framework-4 data-annotations asp.net-mvc-3

9
推荐指数
2
解决办法
5062
查看次数

自定义模型绑定,模型状态和数据注释

我有一些关于自定义模型绑定,模型状态和数据注释的问题.

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

9
推荐指数
1
解决办法
1万
查看次数

Validator.TryValidateProperty不起作用

我正在尝试实现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)

.net c# validation data-annotations

9
推荐指数
1
解决办法
6262
查看次数

使用CheckBoxFor检查是否需要复选框

我需要在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)

我究竟做错了什么?

asp.net-mvc data-annotations razor

9
推荐指数
0
解决办法
9595
查看次数

jQuery不显眼的验证忽略了MVC3中的data-val-required消息

我已经使用这里描述的方法来本地化我的数据注释消息,基本上它在正常形式的帖子中工作正常.我也可以在客户端看到本地化的验证消息.

但是,当我有一个部分视图具有要验证的输入字段并使用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

9
推荐指数
1
解决办法
1万
查看次数

返回多个ValidationExceptions

一直试图将服务器端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)

所以基本上,我的问题是:

  1. 有没有理由为什么没有内置方法同时抛出多个错误?也就是说,我错过了一些DataAnnotation Validations的最佳实践?
  2. 有没有更好的方法来实现我想要实现的目标?
  3. 另外......在将ValidationResult包装到ValidationException中时,如何包含成员名称?

c# validation error-handling data-annotations

9
推荐指数
1
解决办法
2911
查看次数

@ Html.EditorFor DateTime在设置默认值时不显示

我想在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)

c# asp.net-mvc model string-formatting data-annotations

9
推荐指数
1
解决办法
9292
查看次数