使用带有破折号的查询字符串参数的Asp.net Web Api

6

我有一个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

“dash”是一个保留的查询字符串字符吗?还是我使用它有误?
1个回答

0

确实,它被定义为保留字符,详见https://www.rfc-editor.org/rfc/rfc3986(RFC 3986标准页面,该标准定义了统一资源标识符,也称为URI)。

编辑我太匆忙了——在保留字符列表中,我把'='误读成了'-'。但实际上,破折号确实是被列为未保留字符。尽管我不理解,但这只是我的观点...既然这个RFC是官方标准,你应该期望服务器遵守这个格式,可能IIS会,但.NET可能不会(参见下文)。 编辑结束

通常查询字符串遵循以下格式:ITEM '&' ITEM...,其中您可以将ITEM定义为VARIABLE '=' VALUE。

但与编程语言一样,VARIABLE不能包含任何使其难以解析名称或将其映射到变量的字符。因此,不能在变量名中使用诸如'*'和'-'等字符。

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

相同信息的其他来源:


2
@RoyDictus:我在RFC的保留分隔符列表中找不到“-”。你确定它是保留的吗?实际上,它出现在第13页的“未保留”列表中。 - demoncodemonkey
2
你说得对,我把“=”误读成了“-”。我仍然认为使用这个字符没有意义,但显然定义允许使用它。 - Roy Dictus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接