加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-4 – 可为空的可选url参数的ASP.NET MVC 4 RC Web A

发布时间:2020-12-16 07:04:57 所属栏目:asp.Net 来源:网络整理
导读:我想为我的Web API创建一个全局的valdiation属性.所以我遵循 tutorial并最终得到以下属性: public class ValidationActionFilter : ActionFilterAttribute{ public override void OnActionExecuting(HttpActionContext actionContext) { if (actionContext.
我想为我的Web API创建一个全局的valdiation属性.所以我遵循 tutorial并最终得到以下属性:

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

        var errors = new List<KeyValuePair<string,string>>();
        foreach (var key in actionContext.ModelState.Keys.Where(key =>
            actionContext.ModelState[key].Errors.Any()))
        {
            errors.AddRange(actionContext.ModelState[key].Errors
                  .Select(er => new KeyValuePair<string,string>(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));
}

现在当我请求这个网址时: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."
}
]

我认为这不应该作为验证错误出现,因为这些参数都是可选的和可空的.

有没有人遇到过这个问题并找到了解决方案?

解决方法

如果你在Web API和MVC之间乱搞了你的代码,你应该使用来自Web API的RouteParameter而不是来自MVC的UrlParameter

routes.MapHttpRoute(
    name: "Optional parameters route",defaults: new { skip = RouteParameter.Optional,take = RouteParameter.Optional }
    );

但:

您的路由skip和take的默认参数不会对您的路由机制起任何作用,因为您只是在查询字符串中使用它们,而不是在路由模板中使用它们.所以最正确的路线应该是:

routes.MapHttpRoute(
    name: "Optional parameters route",routeTemplate: "api/{controller}"
    );

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读