C# 更改参数名称Web Api模型绑定
我正在使用WebAPI模型绑定来解析URL中的查询参数。例如,下面是一个模型类: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的东西时,这很好用 是否有某种方法可以更改模型类中属性的名称,但保持查询
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错误,并使其与字符串以外的其他类型一起工作,但它可以工作。