Объект передачи постраничного списка Ajax контроллеру

Я работаю над расширенными функциями поиска и столкнулся с препятствием. Я хотел бы использовать AJAX для своих результатов поиска и использовать надстройки PagedList для обработки пейджинга. У меня есть действие AdvancedSearchResults, которое принимает класс фильтров поиска и текущую страницу. Проблема в том, как я могу правильно передать класс фильтров поиска в это действие. Я уверен, что то, что я делаю, просто неправильно организовано, поскольку я думаю, что это было бы довольно распространено. Буду очень признателен за любую помощь. Заранее спасибо.

Действие контроллера:

  public ActionResult AdvancedSearchResults(AdvancedSearchFilters searchFilters, int ? page)
  {
      //DO STUFF

      return PartialView("_SearchResults", results);
  }

Расширенные фильтры результатов поиска:

public class AdvancedSearchFilters
{
   public string SearchText { get; set; }
   public List<string> SelectedTableTypes { get; set; }
   public List<Guid> SelectedGenreIds { get; set; }
   public List<Guid> SelectedPlatformIds { get; set; }
   public int YearMax { get; set; }
   public int YearMin { get; set; }
   public int RatingMin { get; set; }
   public int RatingMax { get; set; }
}

Частичный просмотр результатов поиска:

    @model List<SearchResultItem>

@using PagedList
@using PagedList.Mvc

<!-- 15 Per Page -->
<h2>Search Results</h2>
@if (ViewBag.OnePageOfSearchItems.Count > 0)
{
    <div class="pagination">
        @Html.PagedListPager((IPagedList)ViewBag.OnePageOfSearchItems, page => Url.Action("AdvancedSearchResults", "Search", new { searchFilters = ViewBag.AdvancedSearchFilters, page = page }), 
                              PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions.OnlyShowFivePagesAtATime, "#main-results"))
    </div>
    foreach (var searchResultItem in Model)
    {
        <a href="@Url.Action(searchResultItem.ResultType, searchResultItem.ResultType, new { id = searchResultItem.ResultId })" class="result">
            @if (searchResultItem.ProfileImageLocation != null)
            {
                <img src="@searchResultItem.ProfileImageLocation" alt="@searchResultItem.ResultName" />
            }
            <div class="result-info">
                <h3>@searchResultItem.ResultName</h3>
                <p>@searchResultItem.DisplayText</p>
            </div>
        </a>
    }
    <div class="pagination">
        @Html.PagedListPager((IPagedList)ViewBag.OnePageOfSearchItems, page => Url.Action("AdvancedSearchResults", "Search", new { searchFilters = ViewBag.AdvancedSearchFilters , page = page }), 
                              PagedListRenderOptions.EnableUnobtrusiveAjaxReplacing(PagedListRenderOptions.OnlyShowFivePagesAtATime, "#main-results"))
    </div>
}
else
{
    <span>No Matches.</span>
}

person Aaron Davis    schedule 10.10.2012    source источник
comment
Что вы используете для получения данных? (например, Entity framework, NHibernate, наборы данных?)   -  person Kamyar    schedule 10.10.2012
comment
Я использую структуру сущностей, но поскольку поиск может извлекать несколько типов данных, мне пришлось создать более общую модель для хранения всего этого.   -  person Aaron Davis    schedule 10.10.2012


Ответы (1)


Попробуйте передать данные методу действия в виде json. Попробуйте приведенный ниже код, который передает объект json методу действия.

//// construct your json object.
var jsonObj = '{"SelectedTableTypes" : [{"1","2"}]}';


var postData = $.parseJSON(jsonObj);


$.ajax(
   {
       url: // your URL with Action name AdvancedSearchResults,
       data: postData,
       cache: false,
       dataType: "json",
       success: function (result) {

       },
       error: function (xhr, ajaxOptions, thrownError) {
                                alert(xhr.status);
                                alert(thrownError);
       }
   });
person HashCoder    schedule 10.10.2012