Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 带破折号的Asp.net Web Api查询字符串参数_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 带破折号的Asp.net Web Api查询字符串参数

C# 带破折号的Asp.net Web Api查询字符串参数,c#,asp.net,asp.net-web-api,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; } } /api/changeLog/search?propertyName=asd // Works /api/c

我有一个
Web.Api
搜索方法,它接收以下参数:

[DataContract(Namespace = "", Name = "search")]
public class SearchParameters
{
    [DataMember(Name = "property-name")]
    public string PropertyName { get; set; }
}
/api/changeLog/search?propertyName=asd  // Works

/api/changeLog/search?property-name=asd // Doesn't work
控制器中
,我有以下操作:

[HttpGet]
public void Search([FromUri]SearchParameters request)
{
    var parameters = 1;
}
我正在尝试为
PropertyName
属性(
property name
)创建一个友好的名称,但模型绑定器无法识别参数:

[DataContract(Namespace = "", Name = "search")]
public class SearchParameters
{
    [DataMember(Name = "property-name")]
    public string PropertyName { get; set; }
}
/api/changeLog/search?propertyName=asd  // Works

/api/changeLog/search?property-name=asd // Doesn't work

破折号是保留的查询字符串吗?或者我用错了?

事实上,它是按照中的定义保留的(RFC 3986的标准页面,它定义了统一的资源标识符,也称为URI)

编辑我太快了--在保留字符列表中,我错误地将“=”理解为“-”。似乎破折号确实与未保留字符一起列出。这对我来说毫无意义,但那只是我的观点。。。由于RFC是官方标准,您可能希望服务器遵守该格式——IIS可能会遵守,但.NET可能不会(见下文)。 编辑结束

通常查询字符串遵循格式项“&”项。。。您可以在其中将项定义为变量“=”值

但就像在编程语言中一样,变量不能包含任何使解析名称或将其映射到变量变得困难的字符。因此,变量名中不能使用“*”和“-”等字符

EDIT对于.NET,我认为这是因为.NET试图将查询字符串参数名称映射到方法参数名称。但是,它们应该允许在
[DataMember]
属性中使用破折号。由于情况并非如此,我假设他们在构建此功能时没有咨询RFC。。。有人愿意详细说明一下吗编辑结束

相同信息的其他来源:


@RoyDictus:我在RFC中的保留分隔符列表中似乎找不到“-”。你确定是预订的吗?事实上,它出现在第13页的
无保留
列表中。你是对的,我错读了“=”代表“-”。我认为使用这个字符仍然没有意义,但很明显,这个定义确实允许使用它。