2016-01-26 3 views
0

Моя цель - создать в моем контроллере многокритериальную систему для просмотра сеанса активности. У меня есть три способа фильтрации: по ключевым словам, по дате начала/конца и по пару действий (вход в систему/выход из системы, блокировка включения/блокировка ...). Пользователь может использовать один, один или все из них.Asp .NET MVC сортировать несколько критериев с помощью ajax/json

Это сообщение: How to structure controller to sort multiple criteria asp.net mvc, что очень близко к моим потребностям, но оно было подано в 2010 году, не могли бы вы рассказать мне, если он обновлен? есть ли более простое решение?

На данный момент я построил каждый критерий отдельно с помощью ajax/json/js. Он работает, но я не могу их накапливать.

//----Filter-----Date Period------ 
$("#btndatefilter").click(function() { 
    var startdate = $('#datestart').datepicker('getDate'); 
    var enddate = $('#dateend').datepicker('getDate'); 
    var dateFilter ={ StartDate: startdate.toISOString(), EndDate: enddate.toISOString() }; 
    $.ajax({ 
     url: "/AuditActivities/FilterByDate", 
     type: "GET", 
     data: dateFilter, 
    }) 
    .done(function (auditActivity) { 
     $("#res").html(auditActivity); 
    }); 
}); 
//----Filter-----Activity------ 
$("#Activity").change(function() { 
    var index = $('#Activity').find('option:selected').val(); 
    $.ajax({ 
     url: "/AuditActivities/FilterByActivity", 
     type: "GET", 
     data: { chx: index} 
    }) 
    .done(function (auditActivity) { 
     $("#res").html(auditActivity); 
    }); 
}); 

И в контроллере

public ActionResult FilterByActivity(int chx) 
{ 
    string returnpartial = ""; 
    var auditActivity = db.AuditActivity.Include(a => a.Pc).Include(a => a.Activity).Include(a => a.Users); 
    switch (chx) 
    { 
     case 1: 
      auditActivity = auditActivity.Where(a => a.ActivityId==1 || a.ActivityId == 2); 
      returnpartial = "Indexactivityuser"; 
      break; 
     case 2: 
      auditActivity = auditActivity.Where(a => a.ActivityId==3 || a.ActivityId == 4); 
      returnpartial = "Indexactivityuser"; 
      break; 
     case 3: 
      auditActivity = auditActivity.Where(a => a.ActivityId==5 || a.ActivityId == 6); 
      returnpartial = "Indexactivityuser"; 
      break; 
    } 
    return PartialView(returnpartial, auditActivity.ToList()); 
} 

public ActionResult FilterByDate(DateFilter dateFilter) 
{ 
    DateTime endperiod = dateFilter.EndDate.AddDays(1).AddTicks(-1); 
    string returnpartial = ""; 
    var auditActivity = db.AuditActivity.Include(a => a.Pc).Include(a => a.Activity).Include(a => a.Users); 
    auditActivity = auditActivity.Where(a => a.Date > dateFilter.StartDate && a.Date < endperiod).OrderBy(a => a.Date); 
    returnpartial = "Indexactivityuser"; 
    return PartialView(returnpartial, auditActivity.ToList()); 
} 

ответ

1

Чтобы поместить их вместе, вам необходимо будет представить их в виде отдельного запроса.

Что-то вроде следующего:

public class SearchDefinition 
{ 
    DateFilter dateFilter {get;set;} 
    int activityType { get;set;} //this is chx 
} 

Затем измените контроллер подписи следующим образом:

public ActionResult FilterActivities(SearchDefinition searchDefn) 

При реализации контроллера, вы получили все концепциям уже на месте, так что я Здесь просто проиллюстрируем пример:

returnpartial = "Indexactivityuser"; 
var auditActivity = db.AuditActivity.Include(a => a.Pc).Include(a => a.Activity).Include(a => a.Users); 
switch (searchDefn.activityType) //activitytype will be zero if not set in javascript 
{ 
    case 1: 
     auditActivity = auditActivity.Where(a => a.ActivityId==1 || a.ActivityId == 2); 
     break; 
    case 2: 
     auditActivity = auditActivity.Where(a => a.ActivityId==3 || a.ActivityId == 4); 
     break; 
    case 3: 
     auditActivity = auditActivity.Where(a => a.ActivityId==5 || a.ActivityId == 6); 
     break; 
} 

if(searchDefn.dateFilter!=null){ // datefilter will be null if not set by javascript 

    DateTime endperiod = dateFilter.EndDate.AddDays(1).AddTicks(-1); 

    auditActivity = auditActivity.Where(a => a.Date > dateFilter.StartDate && a.Date < endperiod).OrderBy(a => a.Date); 
} 

Снова у вас есть все концепции в javascript, просто соберите все данные за одной кнопкой и отправьте их в один запрос ajax.

+0

Большое спасибо. Я создал уникальный скрипт с новым методом в контроллере. С if .. для каждого критерия. Это работает. Большой ! – mrplume

Смежные вопросы