FromUri似乎不适用于Web API

时间:2015-11-10 12:13:14

标签: c# asp.net .net asp.net-web-api

我正在尝试实现一个搜索过滤器来获取我的一个控制器中的对象。 我有以下代码:

public class SearchFilter
{
    public DateTime? BusinessDate;
    public DateTime? BusinessDateFrom;
    public DateTime? BusinessDateTo;
    public bool? Status;
}

这是我的控制器:

    public SearchFilter get([FromUri] SearchFilter SearchFilter)
    {
        var Results = db.MyTable.Where(t => t.Published == true);
        if (SearchFilter.BusinessDate != null)
        {
            Results = Results.Where(t => t.BusinessDate == SearchFilter.BusinessDate);
        }
        else
        {
            if (SearchFilter.BusinessDateFrom != null && SearchFilter.BusinessDateTo != null)
            {
                Results = Results.Where(t => t.BusinessDate >= SearchFilter.BusinessDateFrom && t.BusinessDate <= SearchFilter.BusinessDateTo);
            }
        }
        if (SearchFilter.Status != null)
        {
            Results = Results.Where(t => t.Approved == SearchFilter.Status);
        }

        return SearchFilter;
    }

我现在正在返回SearchFilter以查看它是否正常工作,因为过滤无效。

原因如下:

请求:http://localhost:11513/api/MyController/?BusinessDateFrom=2015-09-10&BusinessDateTo=2015-09-12&BusinessDate=09/09/2015&Status=true 结果:

{
  "BusinessDate": null,
  "BusinessDateFrom": null,
  "BusinessDateTo": null,
  "Status": null
}

任何人都可以解释我做错了什么,因为根据这个链接它应该是非常直接的:

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

2 个答案:

答案 0 :(得分:5)

我意识到问题所在。

问题出在SearchFilter类中,每个属性都缺少getset

public class SearchFilter
{
    public DateTime? BusinessDate { get; set; }
    public DateTime? BusinessDateFrom { get; set; }
    public DateTime? BusinessDateTo { get; set; }
    public bool? Status { get; set; }
}

这使它像魅力一样工作。

答案 1 :(得分:0)

这是一个非常古老的问题,但我遇到了一个类似的问题,尽管名称正确且它们都是字符串,但我的模型的一个属性仅被绑定了。

原来我的模特有私人二传手,唯一的作品是有公共作品的财产。

这是另一件事要检查。这个:

sctp_sendmsg()

将仅绑定const uint32_t ttl = 1000; //ms rc = sctp_sendmsg(sctp_socket->fd, data.s, data.len, (struct sockaddr*)&sin, sizeof(sin), htonl(ppid), 0, 0, ttl, 0); if (rc < 0) { printf("Could not connect: %s\n", strerror(errno)); return 0; } ,而public class Model { public string FirstProperty { get; set; } public string SecondProperty { get; private set; } } 将是FirstProperty

就上下文而言,我有个私人的二传手,因为该类只是作为模型而已。在一开始,它只是一系列 Introduce Parameter Object 重构的结果,并由ReSharper自动创建,它仅向公共设置器提供那些稍后在实际中写入的属性。代码。