据我所知,IValidatableObject它用于以一种方式验证对象,让人们相互比较属性.
我仍然希望有属性来验证单个属性,但我想在某些情况下忽略某些属性的失败.
我是否试图在下面的情况下错误地使用它?如果不是我如何实现这个?
public class ValidateMe : IValidatableObject
{
[Required]
public bool Enable { get; set; }
[Range(1, 5)]
public int Prop1 { get; set; }
[Range(1, 5)]
public int Prop2 { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (!this.Enable)
{
/* Return valid result here.
* I don't care if Prop1 and Prop2 are out of range
* if the whole object is not "enabled"
*/
}
else
{
/* Check if Prop1 and Prop2 …Run Code Online (Sandbox Code Playgroud) 我已经实现IValidatableObject了几次并且从未发现解析ValidationContext到Validate方法的目的是什么- 我的典型IValidatableObject实现看起来像这样:
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (Prop1 == Prop2)
{
yield return new ValidationResult(
"Prop1 and Prop2 must be different.",
new[] {"Prop1", "Prop2"});
}
}
Run Code Online (Sandbox Code Playgroud)
有什么我错过了我可以用validationContext的吗?
编辑:我正在使用ASP.NET MVC,这是在类中实现的 - 而不是在控制器中.
目前我的业务对象实现IDataErrorInfo.由于我打算在ASP.NET MVC 3中使用这些库,我想我应该实现IValidatableObject或者可能代替.
WPF可以使用IValidatableObject吗?
DataAnnotations如何适应图片?
我有一个测试类,有几个测试,检查实体是否IsValid.我开始使用IValidatableObject自己的自定义验证,但我坚持使用正确的验证技术.
这是我的Test类:
[TestFixture]
public class StudentTests {
private static Student GetContactWithContactInfo()
{
return new Student(new TestableContactRepository())
{
Phone = "7275551111"
};
}
private static Student GetContactWithoutContactInfo()
{
return new Student(new TestableContactRepository());
}
[Test]
public void Student_Saving_StudentHasInfo_IsValid ()
{
// Arrange
Student student = GetContactWithContactInfo();
// Act
student.Save();
// Assert
Assert.IsTrue(student.IsValid);
}
[Test]
public void Student_Saving_StudentDoesNotHaveInfo_IsNotValid ()
{
// Arrange
Student student = GetContactWithoutContactInfo();
// Act
student.Save();
// Assert
Assert.IsFalse(student.IsValid);
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的实体:
public class Student : …Run Code Online (Sandbox Code Playgroud) 我有一个ViewModel,它有一些DataAnnotations验证,然后对于更复杂的验证实现IValidatableObject并使用Validate方法.
我期待的行为是这样的:首先是所有DataAnnotations,然后,只有在没有错误的情况下,验证方法.我怎么发现这并非总是如此.我的ViewModel(演示版)有一个string,一个decimal和一个文件decimal?.所有这三个属性都只有Required属性.对于string和,decimal?行为是预期的行为,但对于decimal,当为空时,必需的验证失败(到目前为止很好),然后执行Validate方法.如果我检查属性,它的值为零.
这里发生了什么?我错过了什么?
注意:我知道必须使用Required属性来检查值是否为null.所以我希望被告知不要在不可空类型中使用Required属性(因为它不会触发),或者,某种程度上该属性理解POST值并注意该字段未被填充.在第一种情况下,属性不应该触发,并且应该触发Validate方法.在第二种情况下,属性应该触发,并且不应触发Validate方法.但我的结果是:属性触发器和Validate方法触发.
这是代码(没什么特别的):
控制器:
public ActionResult Index()
{
return View(HomeModel.LoadHome());
}
[HttpPost]
public ActionResult Index(HomeViewModel viewModel)
{
try
{
if (ModelState.IsValid)
{
HomeModel.ProcessHome(viewModel);
return RedirectToAction("Index", "Result");
}
}
catch (ApplicationException ex)
{
ModelState.AddModelError(string.Empty, ex.Message);
}
catch (Exception ex)
{
ModelState.AddModelError(string.Empty, "Internal error.");
}
return View(viewModel);
}
Run Code Online (Sandbox Code Playgroud)
模型:
public static HomeViewModel LoadHome()
{
HomeViewModel viewModel = new HomeViewModel();
viewModel.String = string.Empty;
return viewModel;
} …Run Code Online (Sandbox Code Playgroud) asp.net asp.net-mvc data-annotations asp.net-mvc-3 ivalidatableobject
我有一个实现IValidatableObject的视图模型,并且还有几个验证属性.当我尝试在我的ApiController上调用一个动作时,只执行属性验证.ASP.NET Web API不支持IValidatableObject吗?复杂验证的替代方法是什么,不能用单个属性表示?
编辑:在某个地方,我必须搞砸了一些东西.验证神秘地开始按预期工作.看起来默认情况下肯定支持IValidatableObject.
validation data-annotations ivalidatableobject asp.net-web-api
我有以下模型类:
public abstract class CompanyFormViewModelBase
{
public CompanyFormViewModelBase()
{
Role = new CompanyRoleListViewModel();
ContactPerson = new PersonListViewModel();
Sector = new SectorListViewModel();
}
[Required]
[Display(Name = "Company Name")]
public string CompanyName { get; set; }
public CompanyRoleListViewModel Role { get; set; }
[Display(Name = "Contact Name")]
public PersonListViewModel ContactPerson { get; set; }
public SectorListViewModel Sector { get; set; }
}
public class AddCompanyViewModel : CompanyFormViewModelBase, IValidatableObject
{
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
PlugandabandonEntities db = new PlugandabandonEntities();
CompanyName = CompanyName.Trim(); …Run Code Online (Sandbox Code Playgroud) 我尝试IValidatableObject在 ASPNET Core 2 中的 Razor Page 模型上实现。
我很惊讶没有调用 Validate 方法。然而,将所有[BindableProperty]s移动到新类型实现IValidatableObject确实有效。
这是唯一的方法吗? 能够IValidatableObject直接在我的.Microsoft.AspNetCore.Mvc.RazorPages.PageModel类型上实现会很好。
我正在开发一个基于 EntityFrameworkCore 并针对 ASP.NET Core 2.1 的网站。我想为模型中的枚举字段指定错误消息,如下所示:
\n\n[Required(ErrorMessage = "Select an item from the list.")]\npublic MyEnum MyEnum { get; set; }\nRun Code Online (Sandbox Code Playgroud)\n\n但是,仍然生成库存消息:The value \'0\' is invalid。问题似乎是在评估我的任何代码之前验证枚举类型。这里介绍的两种方法(https://www.codeproject.com/Articles/1204077/ASP-NET-Core-MVC-Model-Validation),要么创建一个继承自 ValidationAttribute 的类,要么让模型继承自 IValidatableObject受此之苦。
我找到了一个解决方法:将字段声明为 int,然后使用自定义验证属性:
\n\n[EnumCheck(typeof(MyEnum), ErrorMessage = "Select an item form the list.")]\npublic int MyEnum { get; set; }\nRun Code Online (Sandbox Code Playgroud)\n\n...然后从 ValidationAttribute 继承子类:
\n\nsealed public class EnumCheck : ValidationAttribute\n{\n readonly Type t_;\n\n public EnumCheck(Type t)\n {\n t_ = t;\n }\n\n public override bool IsValid(object …Run Code Online (Sandbox Code Playgroud) c# enums validationattribute ivalidatableobject asp.net-core-2.1
我正在尝试IValidatableObject在 web api 2 上下文中使用验证。该Validate方法正在被调用,但ValidationContext传递的参数有一个调用的方法GetService,该方法始终返回 null,因为从未设置验证上下文的服务提供者。
从我所有的研究来看,我们可以轻松地在 MVC 框架中配置它,但我没有找到任何关于如何在 web api 2 中配置它的信息。
在验证传递给 的模型时,我们如何将服务提供者设置为验证上下文ApiController?
c# validation ivalidatableobject asp.net-apicontroller asp.net-web-api2
好吧,我的问题是我正在使用 aspnetcore 2.1 创建一个 api,为了避免代码重复,我创建了一个具有共享 dtos 属性的抽象类(board、boardforcreation、boardforupdate 等)。我使用 ivalidatableobject 添加到抽象类个性化验证,现在,我想向从抽象类派生的类添加个性化验证,但它告诉我从 ivalidatableobject 接口扩展是多余的,因为它已经在基类中声明了,而且当我在派生类中添加 Validate 方法时,它告诉我它已经声明并实现了,那么,如何使用 ivalidatableobject 在抽象类和派生类中添加验证?或者还有其他方法可以实现这一目标。先感谢您。
public class Board : BoardAbstractBase, IValidatableObject
{
public Guid BoardId { get; set; }
public DateTimeOffset StartDate { get; set; }
public DateTimeOffset EndDate { get; set; }
}
public abstract class BoardAbstractBase : AbstractBasicEntity, IValidatableObject
{
public DateTimeOffset EstimatedStartDate { get; set; }
public DateTimeOffset EstimatedEndDate { get; set; }
public decimal EstimatedBudget { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if …Run Code Online (Sandbox Code Playgroud) 所以我有一个注册用户和业务合作伙伴的网络应用程序.
这就是我的模型的样子
public class UserModel : IValidatableObject
{
//here are some properties and methods that I am using in Validate method
public CompanyModel Company { get; set; } //this is user Company
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (this.UserWithEmailExists())
yield return new ValidationResult("Email already exists", new[] { "Email" });
if (this.UserWithUsernameExists())
yield return new ValidationResult("Username already exists", new[] { "Username" });
}
}
public class CompanyModel : IValidatableObject
{
//again here are some properties that i am using in Validate …Run Code Online (Sandbox Code Playgroud) 我在我的 api 控制器类之一中使用以下 DTO 类,在一个 asp.net 核心应用程序中。
public class InviteNewUserDto: IValidatableObject
{
private readonly IClientRepository _clientRepository;
public InviteNewUserDto(IClientRepository clientRepository)
{
_clientRepository = clientRepository;
}
//...code omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
这就是我在控制器中使用它的方式
[HttpPost]
public async Task<IActionResult> RegisterUser([FromBody] InviteNewUserDto model)
{
if (!ModelState.IsValid) return BadRequest(ModelState);
//...omitted for brevity
}
Run Code Online (Sandbox Code Playgroud)
但是我System.NullReferenceException在 DTO 类中得到了一个这是因为依赖注入在 DTO 类中不起作用。我怎样才能解决这个问题 ?
dependency-injection model-validation ivalidatableobject asp.net-core
c# ×5
validation ×5
.net-4.0 ×2
asp.net ×2
asp.net-core ×2
asp.net-mvc ×2
.net ×1
c#-4.0 ×1
entity ×1
enums ×1
inheritance ×1
razor-pages ×1
tdd ×1