【问题标题】:Passing single object vs passing multiple parameters WebAPI2传递单个对象与传递多个参数 WebAPI2
【发布时间】:2018-06-19 11:56:26
【问题描述】:

我正在开发 WepApi2,我正在实现高级搜索功能。我现在有3个选项有10多个参数,还有一些分页参数。

1) 将对象作为参数传递,该参数将具有所有必需的过滤器。

2) 传递大约 10-12 个参数。

3) 方法1的扩展。我将一个对象转换为查询字符串,然后将查询字符串转换回对象。问题是我没有可以返回所有结果的默认 Get 方法。但是,我可以检查查询字符串是否为空并调用该方法。

我应该选择哪一个?在第一个中,我将不得不进行装箱和拆箱,因为 HttpClient Get 请求不支持 Body。

在第二个中,即使添加了一个参数,我也必须更改两到三个位置,因为我使用的是三层架构。

第一种方法的代码

public class GeneralSearchViewModel
{
    public int RecordsPerPage { get; set; }
    public bool CalculateTotal { get; set; }
    public int CurrentPage { get; set; }
}
public class SomeAdvanceFilterClass : GeneralSearchViewModel
{
    public Guid Dummy { get; set; }
    public string DummyProperty2 { get; set; }
    public string DummyProperty3 { get; set; }
    public string DummyProperty4 { get; set; }
    public string DummyProperty5 { get; set; }
    public string DummyProperty6 { get; set; }
}
public class DummyController : ApiController
{
    public SearchResultModel<DummyModel> Get(SomeAdvanceFilterClass filter)
    {
        Logic logic = new Logic();
        return logic.GetResult(filters);
    }
}

不知道如何调用它,因为 HttpClient 不支持带正文参数的 Get Request。即使由于缓存问题和其他一些问题,它也不推荐。

第二种方法

public class DummyController : ApiController
{
    public SearchResultModel<DummyModel> Get(int RecordsPerPage,bool CalculateTotal,int CurrentPage,Guid Dummy,string DummyProperty2....)
    {
        Logic logic = new Logic();
        return logic.GetResult(RecordsPerPage,CalculateTotal,CurrentPage,Dummy...);
    }
}

这需要对路由配置进行一些更改,否则我需要使用默认参数。此外,一个参数的变化需要所有层的变化

所有方法似乎都有一些大问题。有什么好的推荐。我没有使用.NETCORE,所以不能对正文使用 Get 请求。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-web-api2


    【解决方案1】:

    您可以使用 [FromUri] 属性来处理第一种方法。

    public class DummyController : ApiController
    {
       public SearchResultModel<DummyModel> Get([FromUri]SomeAdvanceFilterClass filter)
       {
         Logic logic = new Logic();
         return logic.GetResult(filters);
       }
    }
    

    在这种情况下,来自 URI 的值应该映射到您的类。

    【讨论】:

    • 如何使用带有get请求的HttpClient发送对象?
    • @SafiMustafa 在简单类的情况下,它是从参数名称到类属性名称的直接映射,例如示例。所以应该是这样的:/api/dummy?Dummy=b94a3f1b-15cd-4feb-ac34-bd58bc1c3c2b&DummyProperty2=somedata
    • 是的,我必须将对象转换为查询字符串。所以我写了一个函数来将任何对象转换为查询字符串。
    猜你喜欢
    • 1970-01-01
    • 2012-11-20
    • 1970-01-01
    • 2010-09-07
    • 2021-01-23
    • 1970-01-01
    • 2013-07-08
    • 2021-09-21
    相关资源
    最近更新 更多