我使用Asp.Net MVC 2与实体框架4.情况如下:我有一个复选框和一个文本框(日期选择器).如果选中该复选框,则需要文本框.如果复选框为false,则不需要文本框.
Checkbox True => Textbox Required
Checkbox False =>不需要文本框
<%:Html.CheckBoxFor(model => model.oEnvironment.Remediate) %>
<%= Html.TextBoxFor(model => model.oEnvironment.DatePick)%>
Run Code Online (Sandbox Code Playgroud)
我知道如何创建ValidationAttribute但我不知道如何创建一个验证类来验证是否选中了复选框(如果我的实体修复属性为true),然后根据需要放置DatePick字段.
任何的想法 ?
validation entity-framework-4 validationattribute asp.net-mvc-2
我有一个我创建的ValidationAttribute,它在Server和Client之间共享.为了在数据助手类中引用时将验证属性正确生成到客户端,我必须非常具体地构建它.
我遇到的问题是,由于某种原因,当我从自定义验证属性类返回ValidationResult时,它的处理方式与客户端UI上的其他验证属性不同.而不是显示错误,它什么都不做.它会正确验证对象,但它不会显示失败的验证结果.
下面是我的一个自定义验证类的代码.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.DataAnnotations;
namespace Project.Web.DataLayer.ValidationAttributes
{
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field, AllowMultiple = false)]
public class DisallowedChars : ValidationAttribute
{
public string DisallowedCharacters
{
get
{
return new string(this.disallowedCharacters);
}
set
{
this.disallowedCharacters = (!this.CaseSensitive ? value.ToLower().ToCharArray() : value.ToCharArray());
}
}
private char[] disallowedCharacters = null;
private bool caseSensitive;
public bool CaseSensitive
{
get
{
return this.caseSensitive;
}
set
{
this.caseSensitive = value;
}
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext) …Run Code Online (Sandbox Code Playgroud) validation silverlight binding wcf-ria-services validationattribute
有没有办法验证GUID数据类型?
我正在使用验证属性. http://msdn.microsoft.com/en-us/library/ee707335%28v=vs.91%29.aspx
我尝试创建自定义ValidationAttribute:
public class RollType : ValidationAttribute
{
public override bool IsValid(object value)
{
return false; // just for trying...
}
}
Run Code Online (Sandbox Code Playgroud)
然后我创建(在另一个类) -
[RollType]
[Range(0,4)]
public int? Try { get; set; }
Run Code Online (Sandbox Code Playgroud)
在视图上(我使用MVC)我写道:
<div class="editor-label">
Try:
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Try)
@Html.ValidationMessageFor(model => model.Try)
</div>
Run Code Online (Sandbox Code Playgroud)
"范围"的验证效果很好,但不适用于自定义的验证!
可能是什么问题?
我在测试自定义验证属性时遇到了一些麻烦.因为方法签名就是protected当我IsValid在单元测试中调用方法时,我无法传入一个Mock<ValidationContext>对象,而是调用基类virtual bool IsValid(object value).
ValidationAttribute
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var otherPropertyInfo = validationContext.ObjectType.GetProperty(this.otherPropertyName);
var otherPropertyValue = otherPropertyInfo.GetValue(validationContext.ObjectInstance, null);
if (value != null)
{
if (otherPropertyValue == null)
{
return new ValidationResult(FormatErrorMessage(this.ErrorMessage));
}
}
return ValidationResult.Success;
}
Run Code Online (Sandbox Code Playgroud)
测试
[Test]
public void Should_BeValid_WhenPropertyIsNullAndOtherPropertyIsNull()
{
var attribute = new OptionalIfAttribute("test");
var result = attribute.IsValid(null);
Assert.That(result, Is.True);
}
Run Code Online (Sandbox Code Playgroud)
如果我无法传入模拟的验证上下文,那么我该如何正确测试这个类呢?
我用反射器进行搜索,但没有找到一种ValidationResult.MemberNames应该包含多个值的情况。
所以,首先我想知道为什么 MS 必须这样做IEnumerable<string>,那么既然他们已经这样做了,我可以相信这个属性只会返回一个值吗?
关于 DataAnnotations 验证系统的更新我发现更多的马虎:
TryValidateProperty则 和应该已从validationResultsTryValidateObject参数中删除错误。而这样的例子不胜枚举。
我总是用它ModelState.IsValid来检查我在服务器端正确验证的所有模型验证,但我认为使用它有一个限制.例如,我定义了一个RemoteValidation属性,但如果我禁用,javascript那么ModelState.IsValid不要检查远程验证并始终返回true,问题在哪里?这是一个限制ModelState.IsValid或是我的错?如果有必要,我可以添加我的所有实现.
validation model-view-controller modelstate validationattribute asp.net-mvc-3
我在 API 控制器中有一个 GET 方法。我希望使用自定义验证属性来验证该方法,如下所示。但是由于某些原因它没有被解雇。
[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class CheckValidRoute : ValidationAttribute
{
private readonly string _apiRoute;
private readonly string _operation;
public override bool RequiresValidationContext { get { return true; } }
public CheckValidRoute(string apiRoute, string operation)
{
_apiRoute = apiRoute;
_operation = operation;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
//Validation logic here
}
}
Run Code Online (Sandbox Code Playgroud)
public class TestController : ControllerBase
{
[HttpGet("production/{movieId}/Test")]
[ProducesResponseType(typeof(ResponseModel<string>), 200)]
[Authorize(Policy = SecurityConstants.PseudofilmAuthorizationPolicy)]
[CheckValidRoute("production/{movieId}/Test", "GET")]
public async Task<ResponseModel<string>> TestGet(long movieId) …Run Code Online (Sandbox Code Playgroud) 基本上我想弄清楚的是如何要求在视图中填写两个字段中的至少一个.
在我的视图中,我有两个名为ISBN和ISBN13的文本字段.用户填写哪一个并不重要,只要其中一个填写.
我不确定在这里做什么期望考虑编写一个自定义验证器,所以我想我先问.我会包含一些代码,但由于它只是两个简单的字段,我认为这种解释会更好.
我有一个自定义验证属性,当我通过POST向服务器发出请求时,会在属性上触发两次IsValid方法.
它导致返回的错误消息被复制.
我已经使用Fiddler检查过请求只被触发一次,因此情况是1请求模型绑定触发两次.
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Property, AllowMultiple = false, Inherited = true)]
public class MinimumAgeAttribute : ValidationAttribute
{
private readonly int _minimumAge;
public MinimumAgeAttribute(int minimumAge)
{
_minimumAge = minimumAge;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
DateTime date;
if (DateTime.TryParse(value.ToString(), out date))
{
if (date.AddYears(_minimumAge) < DateTime.Now)
{
return ValidationResult.Success;
}
}
return new ValidationResult("Invalid Age, Clients must be 18 years or over");
}
}
Run Code Online (Sandbox Code Playgroud) c# asp.net model-validation validationattribute asp.net-web-api2
c# ×6
validation ×5
asp.net ×2
asp.net-mvc ×2
asp.net-core ×1
binding ×1
modelstate ×1
moq ×1
silverlight ×1
unit-testing ×1
wpf ×1