当dropdownlist值为,yes并且字段必须为date 时,我正在尝试使用FluentValidation validaton .当dropdownlist yes检查时它正在工作date.但是当我选择No它时,它也会显示验证Must be date.
它应该不再验证是否下拉列表值除了yes.我们怎么做?
RuleFor(x => x.DtPublishedTimeText)
.NotEmpty()
.When(HasMaterialPublishedElseWhereText)
.WithMessage("Required Field")
.Must(BeAValidDate)
.WithMessage("Must be date");
private bool BeAValidDate(string val)
{
DateTime date;
return DateTime.TryParse(val, out date);
}
private bool HasMaterialPublishedElseWhereText(MeetingAbstract model)
{
return model.HasMaterialPublishedElseWhereText != null &&
model.HasMaterialPublishedElseWhereText.Equals("yes");
}
Run Code Online (Sandbox Code Playgroud) 我有一个使用Fluent Validation for MVC 5的ASP.NET MVC 5项目.我还使用jQuery masking插件自动添加数千个双值.
在模型中我有:
[Display(Name = "Turnover")]
[DisplayFormat(ApplyFormatInEditMode = true,ConvertEmptyStringToNull =true,DataFormatString ="#,##0")]
public double? Turnover { get; set; }
Run Code Online (Sandbox Code Playgroud)
在视图中我有:
<th class="col-xs-2">
@Html.DisplayNameFor(model=>model.Turnover)
</th>
<td class="col-xs-4">
@Html.TextBoxFor(model => model.Turnover, new { @class = "form-control number", placeholder="Enter number. Thousands added automatically" })
</td>
<td class="col-xs-6">
@Html.ValidationMessageFor(model => model.Turnover, "", new { @class = "text-danger" })
</td>
Run Code Online (Sandbox Code Playgroud)
为包含模型定义了一个流畅的验证器,但它不包含任何规则.我只使用服务器端验证.
public class MyModelValidator: AbstractValidator<MyModel>
{
public MyModelValidator()
{
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用模型绑定来解决这个问题.但是模型绑定器的断点永远不会受到打击 - 流畅的验证似乎阻止了达到模型绑定器的价值.
我目前正在使用Fluent Validation而不是使用Data Annotations我的Web API并使用swagger来获取API文档.流畅的验证规则没有反映在swagger模型中,因为我无法使用swagger模式过滤器配置流畅的验证规则.
本博客对ASP.net MVC使用它有很好的解释.但我无法配置它在ASP.net Core中使用它.
到目前为止,我已经尝试了以下代码,但我无法获得验证器类型.
services.AddSwaggerGen(options => options.SchemaFilter<AddFluentValidationRules>());
public class AddFluentValidationRules : ISchemaFilter
{
public void Apply(Schema model, SchemaFilterContext context)
{
model.Required = new List<string>();
var validator = GetValidator(type); // How?
var validatorDescriptor = validator.CreateDescriptor();
foreach (var key in model.Properties.Keys)
{
foreach (var propertyValidator in validatorDescriptor.GetValidatorsForMember(key))
{
// Add to model properties as in blog
}
}
}
}
Run Code Online (Sandbox Code Playgroud) 输入验证的常见做法是什么?换句话说,您是在客户端,服务器端还是双方检查输入验证?
此外,如果性能对我来说至关重要,那么客户端输入验证是否足以支持我的网站而不会带来任何安全风险?
我是否需要在应用程序Bootstrapper中添加任何配置代码以在Nancy中启用FluentValidation?
按照https://github.com/NancyFx/Nancy/tree/master/src/Nancy.Demo.Validation中的示例,我尝试在模型上使用this.Validate时收到以下异常消息:无法找到模型验证工厂.
我正在使用Nancy版本0.11.0.0
在ASP.NET MVC4应用程序中,我们使用FluentValidation来验证我们的模型.在某些情况下,我们只想在另一个属性具有值时验证属性.我们使用When关键字来完成此任务.一个简单的验证类如下所示:
public class PersonValidator : AbstractValidator<Person>
{
public PersonValidator()
{
RuleFor(item => item.FirstName).NotEmpty();
RuleFor(item => item.LastName).NotEmpty().When(item => !string.IsNullOrEmpty(item.FirstName))
}
}
Run Code Online (Sandbox Code Playgroud)
我们希望对此进行客户端验证.我试图创建一个自定义FluentValidationPropertyValidator.但我找不到一种方法来获取验证规则的When部分.有人能指出我正确的方向吗?
是否可以单独测试FluentValidation PropertyValidator?
我知道我可以测试使用PropertyValidator特定错误的Validator,但是如果可能的话,我宁愿在属性验证器上测试true/false.
可以这样做吗?如果是这样,怎么样?
脚本
我有一个自定义规则来验证订单的运费:
public class OrderValidator : BaseValidator<Order>
{
private string CustomInfo { get; set; }
public OrderValidator()
{
//here I call the custom validation method and I try to add the CustomInfo string in the message
RuleFor(order => order.ShippingCost).Cascade(CascadeMode.StopOnFirstFailure).NotNull().Must(
(order, shippingCost) => CheckOrderShippingCost(order, shippingCost)
).WithMessage("{PropertyName} not set or not correct: {PropertyValue}." + (String.IsNullOrEmpty(CustomInfo) ? "" : " " + CustomInfo));
}
//this is the custom validation method
private bool CheckOrderShippingCost(Order o, decimal shippingCost)
{
bool res = false;
try
{ …Run Code Online (Sandbox Code Playgroud) 我有一个包含一个字符串属性的类:
public class Bla
{
public string Parameter { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我想编写一个自定义的AbstractValidator,它检查Parameter是否等于这些字符串中的任何一个:
str1, str2, str3
Run Code Online (Sandbox Code Playgroud)
我想这将是一个起点:
RuleFor(x => x.Parameter).Must(x => x.Equals("str1") || x.Equals("str2") || x.Equals("str3")).WithMessage("Please only use: str1, str2, str3");
Run Code Online (Sandbox Code Playgroud)
但是我可以将其链接并显示错误消息,理想情况下不会对可能性进行硬编码,例如:
Please only use: str1, str2, str3
Run Code Online (Sandbox Code Playgroud) 我对API控制器有一个动作,如下所示:
[HttpPost]
public async Task<IActionResult> StartDeployment(
[FromQuery]Guid deploymentId,
[FromRoute]RequestInfo requestInfo,
[FromBody]DeploymenRequest deploymentRequest)
{
}
Run Code Online (Sandbox Code Playgroud)
它由复杂的url(requestInfo)提供,并接收HTTP POST请求payload(deploymentRequest).
是否可以组合[FromRoute],[FromBody]所以我会有单一的请求模型:
public class UberDeploymentRequestInfo
{
[FromQuery]public Guid DeploymentId { get; set; }
[FromRoute]public RequestInfo RequestInfo { get; set; }
[FromBody]public DeploymenRequest DeploymentRequest { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
所以我可以使用Fluent验证使用单个验证器:
internal class UberDeploymentRequestInfoValidator : AbstractValidator<UberDeploymentRequestInfo>
{
public UberDeploymentRequestInfoValidator()
{
// validation rules can access both url and payload
}
}
Run Code Online (Sandbox Code Playgroud) fluentvalidation ×10
c# ×6
asp.net-mvc ×3
asp.net-core ×2
validation ×2
asp.net ×1
nancy ×1
swagger ×1
xval ×1