ASP.NET Razor Grid Pager в частичном представлении

Во-первых, спасибо, что нашли время взглянуть на мою проблему.

У меня есть веб-сайт ASP.net MVC3, на котором мы используем Razor.

На этом сайте у нас есть страница, которая отображает сетку в частичном представлении.

<div id="tradeList">
    @{ @Html.Partial("~/Views/Trade/TradeGrid.cshtml", Model.TradeList); }
</div>

На главной странице я добавил немного javaScript, чтобы проверить, требует ли сетка обновления, а затем обновите его, если необходимо, и это работает хорошо.

Однако при переходе на страницу 2 таблицы после обновления неполная страница отображается в полноэкранном режиме, а не в родительском представлении. Я заметил URL-адреса для обновления ссылок на страницы после обновления, любые идеи о том, как этого можно избежать.

Частичный вид ниже

@model HRM.Models.Trades

@{
    var grid = new WebGrid(Model.RecapTradeModelList, canPage: true, rowsPerPage: Model.PageSize);        
}
@grid.Table(columns: columns, tableStyle: "standardtable", htmlAttributes: new { id="tradeGridID" })
@{
    string sRowCount;
    if (grid.TotalRowCount == 0)
    {
        sRowCount = "No trades found";
    }
    else if (grid.TotalRowCount == 1)
    {
        sRowCount = "1 trade found";
    }
    else
    {
        sRowCount = Convert.ToString(@grid.TotalRowCount) + " trades found.";
    }

    if (grid.TotalRowCount > 1)
    {
        int iStart;
        int iEnd;
        iStart = (grid.RowsPerPage * grid.PageIndex) + 1;
        iEnd = (grid.RowsPerPage * (grid.PageIndex + 1));

        sRowCount += " Showing " + Convert.ToString(iStart) + " to " + Convert.ToString(iEnd) + ".";
    }
}

<div id="pager">@grid.Pager(mode: WebGridPagerModes.All, numericLinksCount: 7)</div>
<div id="rowcount">
    @sRowCount Display
<select name="pageSize" onchange="this.form.submit();">
    <option value="5" @(Model.PageSize == 5 ? "Selected" : "")>5</option>
    <option value="10" @(Model.PageSize == 10 ? "Selected" : "")>10</option>
    <option value="20" @(Model.PageSize == 20 ? "Selected" : "")>20</option>
    <option value="25" @(Model.PageSize == 25 ? "Selected" : "")>25</option>
    <option value="50" @(Model.PageSize == 50 ? "Selected" : "")>50</option>
</select>
    rows per page.
</div>

Контроллер частичного просмотра

public PartialViewResult TradeGrid(int pageSize = 0, string filterPeriod = "")
    {            
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.Cache.SetNoStore();            

        string userRole = _UserRepository.GetUserRoleByUserName(User.Identity.Name);

        Trades model = new Trades();
        model.PageSize = pageSize;

        model.RecapTradeModelList = _TradeRepository.GetRecapTrades(User.Identity.Name, userRole, filterPeriod);

        model.WebGridColumns = GenerateGridColumns();

        return PartialView(model);            
    }

JavaScript обновляет частичное представление.

if (updateRequired == "True")
{
    //$('#tradeList').load('/Trade/TradeGrid?filterPeriod='+fp+'&pageSize='+@(Model.TradeList.PageSize));
    jQuery.ajax({
       url: "/Trade/TradeGrid",
       data: { filterPeriod: fp, pageSize: @(Model.TradeList.PageSize)},
       contentType: "application/html; charset=utf-8",
       type: "GET",
       dataType: "html",
       success : function(data){
                        $('#tradeList').html(data);
                    }
       })                   
 }

Любые предложения о том, как я могу изменить это поведение, были бы очень благодарны. Заранее спасибо.

1 ответ

Не видя сгенерированный HTML, мне приходится гадать, как решить вашу проблему, но я могу определить, какая проблема наиболее вероятна.

У вас есть какой-то тип обработчика щелчков, который обрабатывает изменение страницы (или обновление сетки, которая может включать в себя изменение страницы). Однако ваш элемент обновления сетки / пейджера / сетки находится внутри вашего частичного представления. Когда вы перезагружаете контент в div, содержащий пейджер, jQuery теряет ссылку на пейджер / сетку и, следовательно, AJAX не происходит.

Например, допустим, у меня есть следующий HTML:

<div id="myDiv"><span id="mySpan">Some Text</span></div>

И я обновляю информацию внутри div динамически, затем любые обработчики кликов для span, такие как:

$("#mySpan").on("click", function(){});

больше не будет функционировать. Чтобы предотвратить это, вы должны прикрепить обработчик к элементу HTML, который не заменяется динамическим вызовом. В этом случае я мог бы сделать обработчик кликов:

$("#myDiv").on("click", "#mySpan", function(){});

Это говорит о том, чтобы прикрепить обработчик клика к элементу mySpan внутри элемента myDiv. Если я обновлю содержимое внутри div, обработчик кликов все равно будет работать. Вот как вы заменили амортизированный .live() звонки в jQuery. Кроме того, вы можете прикрепить ваш обработчик к тегу body в вашем HTML.

$("body").on("click", "#myElement#, function(){});

Вы можете сослаться на этот ответ, чтобы увидеть, возможно, более подробно.

Другие вопросы по тегам