2014-10-07 3 views
0

Я новичок в MVC (и веб-разработке). В настоящее время, используя MVC 5 для моего приложения.ASP.NET MVC Index action вызывается каждый postback

У меня есть веб-приложение и пользовательский интерфейс, как на приведенном ниже снимке экрана. В принципе, это одностраничное приложение, и мне нужно загрузить сетку внизу, исходя из выбора пользователя с помощью переключателей вверху. Если нажать «Последние», последние данные пользователя привязаны к сетке. Аналогичным образом, если исторический выбор, исторические данные привязаны к одной и той же сетке.

Мои действия в HomeController.cs - это что-то вроде ниже.

public ActionResult Index() 
{ 
    var viewModel = new ViewModel(); 
    List users = GetLatestUsers(); 
    viewModel.Users = users; 
    return View(viewModel); 
} 

[HttpPost] 
public ActionResult Filter(ViewModel postData) 
{ 
    List users = GetHistoricUsers(); 
    viewModel.Users = users; 
    return View(viewModel); 
} 

Просто чтобы быть более сложным, как просили в комментариях, я привязки к сетке, на мой взгляд что-то вроде этого

@Html.Grid(Model).Columns(columns => 
{ 
/* Adding not mapped column, that renders body, using inline Razor html helper */ 
columns.Add() 
     .Encoded(false) 
     .Sanitized(false) 
     .SetWidth(30) 
     .RenderValueAs(d => 
      @<b> 
       @Html.ActionLink("Edit", "Index") 
      </b>); 


    /* Adding "OrderID" column: */ 
    columns.Add(o => o.OrderID) 
      .Titled("Number") 
      .SetWidth(100); 

    /* Adding "Vip customer" column: */ 
    columns.Add(o => o.Customer.IsVip) 
      .Titled("Vip customer") 
      .SetWidth(150) 
      .RenderValueAs(o => CustomRenderingOfColumn(o)); 

}).SetRowCssClasses(item => item.Customer.IsVip ? "warning" : string.Empty).WithPaging(15).Sortable().Filterable().WithMultipleFilters() 

Теперь проблема я столкнулся это, если пользователь просматривает исторические данные, так как действия Filter, я загружаю исторические данные в сетку. Если пользователь теперь переходит на следующую страницу с помощью управления разбиением на страницы в сетке, он запускает обратную передачу и, следовательно, выполняет действие индекса и всегда загружает последние данные. В идеале, я должен оставаться на одной странице и показывать следующие исторические данные, которые будут показаны на стр. 2.

Просьба помочь мне справиться с этим сценарием.

FYI: Я использую Grid.Mvc для сетки данных и Bottrrap для элементов управления пользовательского интерфейса.

enter image description here

+0

«привязанный к сетке» нуждается в расширении, чтобы этот вопрос имел смысл. – spender

+0

@spender Я добавил пример того, как я привязываю его к просмотру и к сетке. Я также добавил гиперссылку на демонстрацию Grid.MVC в нижней части вопроса. Надеюсь, поможет. – utkarsh

ответ

0

Там не в MVC не postback. ASP.NET MVC отличается от webforms. Если вам нужно показать другой набор данных (стр. 2, стр. 3 и т. Д.) После щелчка ссылок на страницы, вам необходимо написать свой собственный код для этого. В противном случае вы можете рассмотреть PagedList.

Чтобы установить PagedList.Mvc, выполните следующую команду в Package Manager Console. Вы можете использовать NuGet, чтобы получить этот пакет.

PM> Install-Package PagedList.Mvc 

В контроллере, ссылка PagedList и Индексный метод вашего контроллера будет что-то вроде

using PagedList; 

public ActionResult Index(int? page) 
{ 
     var viewModel = new ViewModel(); 
     List users = GetLatestUsers(); 
     viewModel.Users = users; 

     int pageSize = 3; 
     int pageNumber = (page ?? 1); 
     return View(viewModel.Users.ToPagedList(pageNumber, pageSize)); 
} 

И ваш взгляд Index (изменить ссылку на User модели с соответствующим пространством имен)

@model PagedList.IPagedList<Users> 
@using PagedList.Mvc; 
<link href="/Content/PagedList.css" rel="stylesheet" type="text/css" /> 

<table> 
@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.UserId) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.UserName) 
     </td> 
    </tr> 
} 
</table> 

<br /> 

Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount 
@Html.PagedListPager(Model, page => Url.Action("Index", new { page })) 
+0

Я рассмотрел эту часть в своем коде и не решил свою проблему. BTW, Grid.Mvc control уже обрабатывает ту же стратегию, что и для разбивки на страницы. Предположим, что я загрузил последних пользователей через действие индекса. Теперь пользователь хочет видеть исторические данные и применяет фильтр - поэтому он переходит к действию Filter, и я очищаю сетку и загружаю исторические данные в одну и ту же сетку. Теперь пользователь щелкает страницу 2 в сетке. Это событие не будет выполнять HTTP-POST для действия фильтра, вместо этого оно будет проходить через действие Index (http Get). Следовательно, он снова загрузит последние данные (в идеале я должен показать страницу 2 исторических данных). – utkarsh

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