如何为ApiControllers获得与ASP中的常规控制器相同的路由逻辑.NET MVC 4



我从一个控制器开始,它接受这样的过滤参数:

public class CampaignsController : Controller
{
public ActionResult List(string searchstring, string pid, string country, string vertical, string traffictype)
{
var query = db.Campaigns;
if(!string.IsNullOrWhiteSpace(country))
{
query = query.Where(c => c.CountryCode == country);
}
// and so on...      
var viewModel = new CampaignListViewModel { Campaigns = query.ToList(); }
return View(viewModel);
}
}

我喜欢的是,即使某些参数为null,操作也会映射到它。

然后,我转换为Ajax风格,发现ApiController作为生成所需JSON响应的一种方式非常方便。

然而,我发现所有参数都需要出现在查询字符串中,以便路由与Action匹配。

以下是其示例代码:

public class CampaignsApiController : ApiController
{
public IQueryable<CampaignViewModel> Get(string vertical, string traffictype, string search, string country, int? pid)
{
var campaigns = db.Campaigns.AsQueryable();
if (!string.IsNullOrWhiteSpace(vertical))
{
var cr = db.Verticals.Where(v => v.Name == vertical).FirstOrDefault();
if (cr != null)
campaigns = campaigns.Where(c => c.Vertical.Name == vertical);
}
// and so on...
var query = campaigns.AsEnumerable()
.Select(c => new CampaignViewModel(c))
.AsQueryable();
return query;
}
}

ApiController是否可以获得相同的行为?

或者,是否可以修改我的设计方法或我使用ApiController的方式,将ApiControl的默认行为合并为我想要的结果?

以下是这两个类的要点以供参考。

尝试为可能丢失的参数输入一些默认值,例如

public IQueryable<CampaignViewModel> Get(string vertical = null, string traffictype = null, string search = null, string country = null, int? pid = null) {
...
}

最新更新