首页 文章

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

提问于
浏览
1

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

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);
    }
}

我喜欢这个是即使某些参数为空也会映射到它的动作 .

然后我转换为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的方式是否可以通过将ApiController默认行为合并到我之后的结果的方式进行修改?

这是两个类的gist供参考 .

1 回答

  • 1

    尝试为可能缺少的参数添加一些默认值,例如

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

相关问题