我有一个Web.Api
搜索方法,它接收以下参数:
[DataContract(Namespace = "", Name = "search")]
public class SearchParameters
{
[DataMember(Name = "property-name")]
public string PropertyName { get; set; }
}
在Controller
中,我有这个动作:
[HttpGet]
public void Search([FromUri]SearchParameters request)
{
var parameters = 1;
}
我正在尝试为PropertyName
属性(property-name
)创建友好名称,但模型绑定器无法识别参数:
/api/changeLog/search?propertyName=asd // Works
/api/changeLog/search?property-name=asd // Doesn't work
短划线是保留的查询字符串字符吗?或者我使用它错了?
答案 0 :(得分:0)
实际上,它是http://tools.ietf.org/html/rfc3986(RFC 3986的标准页面中定义的保留,它定义了统一资源标识符,也称为URI)。
编辑我太快了 - 我在保留字符列表中误读'='表示' - '。似乎破折号确实列出了未保留的字符。这对我来说没有任何意义,但这只是我的意见......这个RFC是官方标准,你会希望服务器尊重格式 - 可能是IIS,但可能.NET没有(见下文)。 编辑结束
通常查询字符串遵循ITEM'&'格式ITEM ...您可以将ITEM定义为VARIABLE'='VALUE。
但就像在编程语言中一样,VARIABLE不能包含任何难以解析名称或将其映射到变量的字符。因此,'*'和' - '等字符不能用于变量名称。
编辑对于.NET,我希望这是因为.NET尝试将查询字符串参数名称映射到方法参数名称。但是他们应该允许在[DataMember]
属性中使用破折号。由于情况并非如此,我认为他们在构建此功能时没有咨询RFC ...有人会关注详细说明吗? 编辑结束
相同信息的其他来源: