C# 更改参数名称Web Api模型绑定

C# 更改参数名称Web Api模型绑定,c#,asp.net-web-api,model-binding,C#,Asp.net Web Api,Model Binding,我正在使用WebAPI模型绑定来解析URL中的查询参数。例如,下面是一个模型类: public class QueryParameters { [Required] public string Cap { get; set; } [Required] public string Id { get; set; } } 当我调用类似于/api/values/5?cap=somecap&id=1的东西时,这很好用 是否有某种方法可以更改模型类中属性的名称,但保持查询

我正在使用WebAPI模型绑定来解析URL中的查询参数。例如,下面是一个模型类:

public class QueryParameters
{
    [Required]
    public string Cap { get; set; }

    [Required]
    public string Id { get; set; }
}
当我调用类似于
/api/values/5?cap=somecap&id=1
的东西时,这很好用

是否有某种方法可以更改模型类中属性的名称,但保持查询参数名称不变?例如:

public class QueryParameters
{
    [Required]
    public string Capability { get; set; }

    [Required]
    public string Id { get; set; }
}
public class QueryParameters
{
    public string cap {get; set;}
    public string Capability
    {
      get { return cap; }
    }

    public string Id { get; set; }
}
我原以为将
[Display(Name=“cap”)]
添加到
功能
属性会起作用,但事实并非如此。我是否应该使用某种类型的数据注释

控制器的方法如下所示:

public IHttpActionResult GetValue([FromUri]QueryParameters param)    
{
    // Do Something with param.Cap and param.id
}
/api/values/5?cap=somecap&id=1

public IHttpActionResult GetValue([FromUri(Name = "cap")] string capabilities, int id)    
{
}

Web API使用与ASP.NET MVC稍有不同的模型绑定机制。它对正文中传递的数据使用格式化程序,对查询字符串中传递的数据使用模型绑定器(如您的情况)。格式化程序尊重其他元数据属性,而模型绑定程序不尊重

所以,如果您在消息体而不是查询字符串中传递模型,您可以按如下方式对数据进行注释,这样就可以了:

public class QueryParameters
{
    [DataMember(Name="Cap")]
    public string Capability { get; set; }

    public string Id { get; set; }
}
你可能已经知道了。要使其与查询字符串参数和模型绑定器一起工作,您必须使用自己的自定义模型绑定器,该绑定器将实际检查和使用DataMember属性

下面的一段代码就可以做到这一点(尽管它离产品质量还有很远的距离):


我花了几个小时研究同一个问题的健壮解决方案,而一个线性规划器可以很好地解决这个问题:

myModel.Capability = HttpContext.Current.Request["cap"];

您可以使用FromUri绑定属性的Name属性将具有不同名称的查询字符串参数用于方法参数

如果传递的是简单参数而不是
QueryParameters
类型,则可以像下面这样绑定值:

public IHttpActionResult GetValue([FromUri]QueryParameters param)    
{
    // Do Something with param.Cap and param.id
}
/api/values/5?cap=somecap&id=1

public IHttpActionResult GetValue([FromUri(Name = "cap")] string capabilities, int id)    
{
}

我只是遇到了这个问题,并在参数类中使用了一个getter来返回绑定属性

public IHttpActionResult GetValue([FromUri]QueryParameters param)    
{
    // Do Something with param.Capability,
    // except assign it a new value because it's only a getter
}
在你的例子中:

public class QueryParameters
{
    [Required]
    public string Capability { get; set; }

    [Required]
    public string Id { get; set; }
}
public class QueryParameters
{
    public string cap {get; set;}
    public string Capability
    {
      get { return cap; }
    }

    public string Id { get; set; }
}
现在,您可以在控制器中引用
功能
属性

public IHttpActionResult GetValue([FromUri]QueryParameters param)    
{
    // Do Something with param.Capability,
    // except assign it a new value because it's only a getter
}

当然,如果在
param
对象上使用反射或序列化它,则
cap
属性将被包括在内。不过,我不知道为什么有人需要用查询参数来做这件事

HttpContext.Current.Request[“key”]将始终只返回字符串。如果参数名为“$cap”而不是“cap”,该怎么办?+1适用于我,尽管我只在参数名与属性名不同的属性上标记了DataMember属性。因此,我需要将GetValue方法调用和AttemptedValue引用分离出来,并对属性进行null检查,否则可能会出现NullReferenceException。无论如何,这可能不是一个坏主意:)必须修复NullReference错误,并使其与字符串以外的其他类型一起工作,但它可以工作。