Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以访问路由参数/控制器上下文的Web API验证程序_C#_Validation_Asp.net Web Api - Fatal编程技术网

C# 可以访问路由参数/控制器上下文的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

我有一个Web API模型的行

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;
    }
}