Cat*_*lin 6 c# asp.net asp.net-web-api
我有一个Web.Api搜索方法,它接收以下参数:
[DataContract(Namespace = "", Name = "search")]
public class SearchParameters
{
[DataMember(Name = "property-name")]
public string PropertyName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
在Controller,我有这个动作:
[HttpGet]
public void Search([FromUri]SearchParameters request)
{
var parameters = 1;
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试为PropertyNameproperty(property-name)创建一个友好名称,但模型绑定器无法识别参数:
/api/changeLog/search?propertyName=asd // Works
/api/changeLog/search?property-name=asd // Doesn't work
Run Code Online (Sandbox Code Playgroud)
破折号是保留的查询字符串字符?或者我使用它错了?
事实上,它是按照https://www.rfc-editor.org/rfc/rfc3986(RFC 3986 的标准页面,定义统一资源标识符,也称为 URI)中的定义保留的。
编辑我太快了——我在保留字符列表中将“=”误读为“-”。看来破折号确实与未保留的字符一起列出。这对我来说毫无意义,但这只是我的观点......这个 RFC 是官方标准,您会期望服务器尊重该格式 - IIS 可能会尊重这种格式,但 .NET 可能不会(见下文)。 编辑结束
通常查询字符串遵循 ITEM '&' ITEM... 格式,您可以将 ITEM 定义为 VARIABLE '=' VALUE。
但就像在编程语言中一样,VARIABLE 不能包含任何导致难以解析名称或将其映射到变量的字符。因此变量名中不能使用“*”、“-”等字符。
编辑对于 .NET,我希望这是因为 .NET 尝试将查询字符串参数名称映射到方法参数名称。但他们应该允许在属性中使用破折号[DataMember]。由于情况并非如此,我认为他们在构建此功能时没有查阅 RFC...有人愿意详细说明吗?编辑结束
相同信息的其他来源: