C# 条件模型验证

C# 条件模型验证,c#,asp.net-mvc-3,model-validation,C#,Asp.net Mvc 3,Model Validation,我有以下型号: public class DeliveryTracking { public string TrackingRef { get; set; } public string SalesID { get; set; } public string PackingSlipID { get; set; } public string Type { get; set; } } 我有一个动作,它为这个模型设置了

我有以下型号:

public class DeliveryTracking
    {
        public string TrackingRef { get; set; }
        public string SalesID { get; set; }
        public string PackingSlipID { get; set; }
        public string Type { get; set; }
    }
我有一个动作,它为这个模型设置了一些值,然后将其返回到如下视图:

DeliveryTracking track = new DeliveryTracking();
track.SalesID = 123;
track.PackingSlipID = 456;
track.Type = "TNT";
return PartialView("_GetForm", track);
在该视图中,我有一个表单,可以这样设置TrackingRef:

@Html.HiddenFor(model => model.SalesID)
@Html.HiddenFor(model => model.PackingSlipID)
@Html.HiddenFor(model => model.Type)
@Html.EditorFor(model => model.TrackingRef)
<input type="submit" value="Submit" />
@Html.HiddenFor(model=>model.SalesID)
@Html.HiddenFor(model=>model.PackingSlipID)
@Html.HiddenFor(model=>model.Type)
@EditorFor(model=>model.TrackingRef)

我希望这个TrackingRef根据我使用的跟踪类型根据不同的长度进行验证。例如,我已经将跟踪类型设置为TNT,所以我希望它的minlength为7,但是如果我将它设置为UPS,我希望它的minlength为8,这可能吗?我知道我可以在我的模型中设置
MinLength
属性,但我希望它是动态的/有条件的,取决于Im使用的跟踪类型。

您可以添加条件验证规则。使您的模型继承fom
IValidatableObject
并实现验证方法。您可以执行以下操作(我没有测试):

公共类交付跟踪:IValidatableObject
{
公共字符串TrackingRef{get;set;}
公共字符串SalesID{get;set;}
公共字符串打包PID{get;set;}
公共字符串类型{get;set;}
}
公共IEnumerable验证(ValidationContext ValidationContext)
{ 
如果(类型==类型(TNT)和跟踪参考长度<7
返回新的ValidationResult(“TrackingRef必须为7”);
if(类型==类型(UPS)和跟踪参考长度<8)
返回新的ValidationResult(“TrackingRef必须为8”);
}
public class DeliveryTracking : IValidatableObject
    {
        public string TrackingRef { get; set; }
        public string SalesID { get; set; }
        public string PackingSlipID { get; set; }
        public string Type { get; set; }
    }

public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
{ 
    if (Type ==typeOf(TNT) && TrackingRef.Length < 7
        return new ValidationResult("TrackingRef must be 7.");
    if(Type == typeOf(UPS ) && TrackingRef.Length < 8)
        return new ValidationResult("TrackingRef must be 8.");
}