在不使用DataMember的情况下,将请求DTO属性映射到ServiceStack中不同名称的URI参数?

时间:2012-12-24 04:47:17

标签: c#-4.0 rest servicestack dto

基于ServiceStack维基的示例,如果您有这样的URI:

www.servicestack.net/ServiceStack.Hello/servicestack/hello?Name=World

您的请求DTO看起来像这样:

[Route("/hello")]
public class Hello
{
    public string Name { get; set; }
}

但是,如果URI是这样的:

www.servicestack.net/ServiceStack.Hello/servicestack/hello?n=World

您如何使用上述相同的DTO,但将Name映射到“n”?是否有一个属性可以用它来装饰DTO属性?

我尝试使用DataContract和DataMember属性,如下所示:

[DataContract]
[Route("/hello")]
public class Hello
{
    [DataMember(Name = "n")]
    public string Name { get; set; }
}

这样可以正常工作,但是当你有很多属性时它会停止工作,除非你用[DataMember]属性装饰每个属性。

在没有使用DataContract和DataMember的情况下,是否有提供与属性不同的param的自定义名称?也许是ServiceStack提供的自定义属性,所以只有那些需要以不同方式映射的属性才有属性而剩下的只剩下了?

1 个答案:

答案 0 :(得分:2)

.NET DataContract序列化程序在DTO上使用其他名称的标准方法是使用[DataMember]属性。如果您不想这样做,可以使属性名称与QueryString变量(不区分大小写)相同。

除此之外,您提供自己的Custom Request Binder,或者您可以直接从服务内部访问QueryString或过滤:

var name = base.Request.QueryString["n"];

如果你为很多变量做了很多这样的事情,你可以从QueryString中提取并将请求DTO填充到Filter Attribute