【问题标题】:Validate GUID as parameter验证 GUID 作为参数
【发布时间】:2017-11-29 11:14:00
【问题描述】:

我的路线是:

public void RegisterRoute(HttpRouteCollection routes) {
    routes.MapHttpRoute(
        name: "DefaultApi",
        routeTemplate: "api/{controller}/{guid}",
        defaults: new { guid = RouteParameter.Optional }
    );
}

控制器动作就像

public IHttpActionResult Get(Guid guid) {

当我通过 api/{controller}/2ADEA345-7F7A-4313-87AE-F05E8B2DE678 时一切正常,但是当我为 guid 传递无效值时,例如

api/{controller}/xxxxxx 然后我得到错误:

{
  "message": "The request is invalid.",
  "messageDetail": "The parameters dictionary contains a null entry for parameter 'guid' of non-nullable type 'System.Guid' for method 'System.Web.Http.IHttpActionResult Get(System.Guid)' in 'Web.API.Controller.UserController'. An optional parameter must be a reference type, a nullable type, or be declared as an optional parameter."
}

如何显示我自己的消息,例如:

{
  "guid": "The value is invalid.",
}

我正在尝试创建自定义模型绑定器,但它不起作用

public class GuidModelBinder : IModelBinder {

        public bool BindModel(HttpActionContext actionContext, ModelBindingContext bindingContext) {
            var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
            if (value == null) {
                bindingContext.ModelState.AddModelError("guid", "The value is invalid");
                return false;
            }


            var result = Guid.TryParse(value.ToString(), out _);
            if (!result) {
                bindingContext.ModelState.AddModelError("guid", "The value is invalid");
            }
            return result;
        }
    }

请帮忙。如何只显示我的消息

【问题讨论】:

标签: c# asp.net asp.net-mvc asp.net-web-api


【解决方案1】:

您可以通过将Guid 设为Nullable<Guid> 并进行null 检查来做到这一点:

public IHttpActionResult Get(Guid? guid) {

    if(!guid.HasValue || guid.Value == Guid.Empty)
        // return your error here

    else
    //...
}

【讨论】:

  • 我有很多动作。我不能改变每一个动作。还有其他方法吗?
【解决方案2】:

关闭但 BindModel 必须返回一个 Guid。由于您的参数是一个 guid,它是一种值类型,因此它必须具有非空值。在下面的示例中,如果传入的值不是可解析的 guid,我使用 Guid.Empty 作为值。

这将允许 IIS 使用 Guid.Empty 值和您指定的模型错误调用您的控制器。

public class GuidModelBinder : DefaultModelBinder
{
    public override object BindModel(ControllerContext controllerContext, ModelBindingContext bindingContext)
    {
        var value = bindingContext.ValueProvider.GetValue(bindingContext.ModelName);
        Guid guidValue;
        if (value == null || !Guid.TryParse(value.AttemptedValue, out guidValue))
        {
            bindingContext.ModelState.AddModelError("guid", "The value is invalid");
            return Guid.Empty;
        }

        return guidValue;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-23
    • 2012-01-10
    • 1970-01-01
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    相关资源
    最近更新 更多