Ошибка ModelState веб-API ASP.NET MVC 4 RC для необязательных параметров URL, допускающих значение NULL

Я хотел создать глобальный атрибут проверки для своего веб-API. Поэтому я следовал руководству и получил следующий атрибут:

public class ValidationActionFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        if (actionContext.ModelState.IsValid)
        {
            return;
        }

        var errors = new List>();
        foreach (var key in actionContext.ModelState.Keys.Where(key =>
            actionContext.ModelState[key].Errors.Any()))
        {
            errors.AddRange(actionContext.ModelState[key].Errors
                 .Select(er => new KeyValuePair(key, er.ErrorMessage)));
        }

        actionContext.Response =
            actionContext.Request.CreateResponse(HttpStatusCode.BadRequest, errors);
    }
}

Затем я добавил его в глобальные фитлеры в Global.asax :

configuration.Filters.Add(new ValidationActionFilter());

. Он отлично работает с большинством моих действий, но не так, как ожидалось, с действиями, которые имеют необязательные и обнуляемые параметры запроса.

Например:

Я создал маршрут:

routes.MapHttpRoute(
    name: "Optional parameters route", 
    routeTemplate: "api/{controller}", 
    defaults: new { skip = UrlParameter.Optional, take = UrlParameter.Optional });

И действие в моемProductsController:

public HttpResponseMessage GetAllProducts(int? skip, int? take)
{
    var products = this._productService.GetProducts(skip, take, MaxTake);

    return this.Request.CreateResponse(HttpStatusCode.OK, this._backwardMapper.Map(products));
}

Теперь, когда я запрашиваю этот URL:http://locahost/api/productsЯ получаю ответ с кодом состояния 403 и следующим содержимым:

[
{
    "Key": "skip.Nullable`1",
    "Value": "A value is required but was not present in the request."
},
{
    "Key": "take.Nullable`1",
    "Value": "A value is required but was not present in the request."
}
]

Я считаю, что это не должно отображаться как ошибка проверки, поскольку эти параметры являются необязательными и допускают значение NULL.

Кто-нибудь сталкивался с этой проблемой и нашел решение?

5
задан Maksymilian Majer 10 August 2012 в 15:09
поделиться