Как View может узнать, на какой странице находится ajax MVC WebGrid?

У меня есть представление, которое содержит частичное представление, содержащее WebGrid, которое страницы через ajax. Однако мне не удается заставить родительское представление знать, на какой странице находится WebGrid. Я пытаюсь выполнить следующее: у меня есть кнопка «создать» в содержащем представлении, которая переходит на новую страницу, но я бы хотел, чтобы она передавала текущую страницу # в качестве параметра строки запроса на новую страницу, так что если они отменит создание, исходное представление загрузится с предыдущей страницей, а не загружает первую страницу по умолчанию.

Проблема, которую я вижу, заключается в том, что модель родительского представления не изменяется при обновлении сетки частичного представления. И хотя я могу создать метод для ajaxUpdateCallback, я не понял, как сообщить этому методу, что такое текущая страница.

Соответствующие разделы моего кода выглядят так: В родительском представлении:

<div id="divList">
    @Html.Partial("_MatterList", Model) //This is where the grid is defined
</div>
<br/>
<div id="newSection">

<input type="button" value="New Matter" onclick="newMatter();"></input>
</div>
<script type="text/javascript">

    var _Page; //I tried creating a javascript variable to hold the page, but can't get it to populate with anything but the default 1.

    function newMatter() 
    {
        var urlAction = "@Url.Action("Create", "Matter", new { area = "Admin" })";
        var subclientid = $("#SubClientID > option:selected").attr("value"); //defined in a form not displayed here
        var clientid = $("#ClientID > option:selected").attr("value");//defined in a form not displayed here
        redirect(urlAction, clientid, subclientid);

    }
    function redirect(urlAction, clientid, subclientid) {
        if(clientid > 0 || subclientid > 0 ) {
            urlAction += "?";
        }
        if(clientid > 0) {
            urlAction += "clientid=" + clientid;
            if(subclientid > 0) {
                urlAction += "&subclientid=" +subclientid;
            }
        }
        //I want to be able to add page in here as well. a la &page=_Page
        window.location = urlAction;
    }

В частичном представлении _MatterList:

 <div id="matterListing">

    @{

        var grid = new WebGrid<Matter>(null, rowsPerPage: 10, canSort: false, defaultSort: "Name", ajaxUpdateContainerId: "matterListing",ajaxUpdateCallback:"afterUpdate");
        grid.Bind(Model.Matters, rowCount: Model.TotalRows, autoSortAndPage: false);
        @grid.GetHtml(
            tableStyle: "table90",
            alternatingRowStyle: "tableAltRows",
            headerStyle: "tableHeaders",
            columns: grid.Columns(

                grid.Column(...  //there are a lot of columns, removed them because not important to the problem.


                )
                   )
    }
    <script type="text/javascript">
        function afterUpdate() {
            _Page = @Model.PageNumber; //I tried this but it only ever shows 1 because it evaluates when the page first loads.  What I need is for it to dynamically get the correct page at execution time.
        }
    </script>
</div>

Я думаю, что потребуется, чтобы метод afterUpdate принял параметр с текущей страницей (т.е. вызовет afterUpdate (2) вместо использования @ Model.PageNumber), но я не знаю, как заставить WebGrid пройти это вместе с обратным вызовом. Есть ли у кого-нибудь решение этого вопроса?


person anyeone    schedule 04.10.2012    source источник


Ответы (1)


Решение оказалось невероятно простым, меня немного смущает, сколько времени мне потребовалось, чтобы его придумать.

В частичном представлении _MatterList я создал форму и поместил HiddenField с номером страницы:

<form id="frmPage">
    @HiddenFor(model => model.PageNumber)
</form>

Затем на главной странице я изменил newMatter (), чтобы извлечь эту страницу, и redirect (), чтобы добавить ее в качестве параметра строки запроса:

function newMatter() 
{
    var urlAction = "@Url.Action("Create", "Matter", new { area = "Admin" })";
    var subclientid = $("#SubClientID > option:selected").attr("value"); //defined in a form not displayed here
    var clientid = $("#ClientID > option:selected").attr("value");//defined in a form not displayed here
    var page = $("#frmPage").find("#PageNumber").val();
    redirect(urlAction, clientid, subclientid, page);
}

function redirect(urlAction, clientid, subclientid, page)
{
        if(clientid > 0 || subclientid > 0  || page > 1) {
            urlAction += "?";
        }
        if(clientid > 0) {
            urlAction += "clientid=" + clientid;
            if(subclientid > 0) {
                urlAction += "&subclientid=" +subclientid;
            }
            if(page > 1) {
                urlAction += "&page=" + page;
            }
        }
        else if(page > 0){
            urlAction += "page=" + page;
        }
        window.location = urlAction;
}
person anyeone    schedule 08.10.2012