C# 可以访问路由参数/控制器上下文的Web API验证程序
我有一个Web API模型的行C# 可以访问路由参数/控制器上下文的Web API验证程序,c#,validation,asp.net-web-api,C#,Validation,Asp.net Web Api,我有一个Web API模型的行 class SampleModel { [ComponentExistsValidation] public Guid? ComponentID { get; set; } ... } 我需要验证ComponentID是否存在于给定的模型下,并且modelid是否可作为路由参数供我的控制器使用 [Route("api/model/addcomponents/{modelid:int}")] public async Task AddCom
class SampleModel
{
[ComponentExistsValidation]
public Guid? ComponentID { get; set; }
...
}
我需要验证ComponentID
是否存在于给定的模型下,并且modelid
是否可作为路由参数供我的控制器使用
[Route("api/model/addcomponents/{modelid:int}")]
public async Task AddComponents(int modelid, [FromBody]SampleModel[] components)
这是我的验证器
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value == null)
return ValidationResult.Success;
Guid componentid = (Guid)value;
int modelid; // How do I get this here?
Model context_mdl = Model.GetModel(modelid);
if(!context_mdl.HasComponent(componentid))
{
return new ValidationResult(string.Format("Invalid component"));
}
}
我可以访问验证器中的
modelid
route参数吗?您应该能够从HttpContext
获取它
如果HTTPContext不可用,请添加对System.Web.DLL的引用
下面是一个使用IValidatableObject
的示例。但是我相信如果你想的话,你可以把它转换成你的属性
class SampleModel : IValidatableObject
{
public Guid? ComponentID { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (value == null)
return ValidationResult.Success;
Guid componentid = (Guid)value;
int modelid = System.Web.HttpContext.Current.Request.RequestContext.RouteData.GetWebApiRouteData("modelid");
Model context_mdl = Model.GetModel(modelid);
if(!context_mdl.HasComponent(componentid))
{
yield return new ValidationResult(string.Format("Invalid component"));
}
}
}
public static class WebApiExtensions
{
public static object GetWebApiRouteData(this RouteData routeData, string key)
{
if (!routeData.Values.ContainsKey("MS_SubRoutes"))
return null;
object result = ((IHttpRouteData[]) routeData.Values["MS_SubRoutes"]).SelectMany(x => x.Values)
.Where(x => x.Key == key).Select(x => x.Value).FirstOrDefault();
return result;
}
}