私は次のようなフィルターパラメーターを受け取るコントローラーから始めました。
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スタイルに変換し、必要なJSON応答を生成する方法としてApiControllerが便利であることがわかりました。
ただし、ルートをアクションと一致させるには、すべてのパラメーターをクエリ文字列に含める必要があることがわかりました。
そのためのサンプルコードは次のとおりです。
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のデフォルトの動作を私が求めている結果に統合することはできますか?
参考までに、2つのクラスの要点を次に示します。