我想编写一个自定义属性,我可以装饰一个ViewModel属性,当发布ViewModel时,我可以检查哪些已发布的属性具有此属性并运行一些逻辑。 我试图设置条件,这不应该以任何方式影响验证。
[SetsCondition(SomeEnumerationValue)]
public Fund SelectedFund {get;set;}
...
other properties
然后在控制器中。
[HttpPost]
public IActionResult SelectFund(SelectFundViewModel model){
if(ModelState.IsValid){
//check which properties have the SetsCondition Attribute
//read the SomeEnumerationValue for them
..
//profit
}
}
只是不太确定我应该继承什么类型的属性,或者就此而言,如何检查特定的ViewModel属性是否用一个属性进行修饰。
任何非常感谢的帮助
答案 0 :(得分:1)
您可以从继承自Attribute:
创建属性[System.AttributeUsage(System.AttributeTargets.Property)]
public class ConditionAttribute : System.Attribute
{
public readonly string value;
public ConditionAttribute(string value)
{
this.value = value;
}
}
用法
[Condition("Some Value")]
public bool Property { get; set; }
然后,您可以通过反映访问此信息: 以下示例来自上面提供的链接:
System.Reflection.MemberInfo info = typeof(MyClass);
object[] attributes = info.GetCustomAttributes(true);
for (int i = 0; i < attributes.Length; i ++)
{
System.Console.WriteLine(attributes[i]);
}
更新了链接https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/attributes
答案 1 :(得分:0)
必须从System.ComponentModel.DataAnnotations.ValidationAttribute继承,并且必须实现isValid方法。查看https://stackoverflow.com/a/11959931/1270813以获取示例