使用AJAX将模型从局部视图传递到控制器的最佳方法?

时间:2014-07-24 16:21:37

标签: jquery asp.net ajax asp.net-mvc asp.net-mvc-4

我不确定如何解释这个问题,但我一直在研究表格分类器,以此来掌握ASP.NET MVC中的AJAX和JQuery。

到目前为止,它使用此代码:

部分视图:

@model IEnumerable<EH.SASS.TillStatus.Model.Models.TillTransactionsOnHold>
<link href="~/Content/Site.css" rel="stylesheet" />
<script src="~/Scripts/mvctablesort.js"></script>
<script src="~/Scripts/jquery-1.8.2.min.js"></script>
<div id="tablediv">
    <table id="empTable">
        <thead>
            <tr>
                <th data-attr="tillnetworkid">Till Network ID
                </th>
                <th data-attr="transactiontype">Transaction Type
                </th>
                <th data-attr="tid">TID
                </th>
                <th data-attr="transactionid">Transaction ID
                </th>
                <th data-attr="cardno">Card No.
                </th>
                <th data-attr="receiptno">Receipt No.
                </th>
                <th data-attr="scheme">Scheme
                </th>
                <th data-attr="amount">Amount
                </th>
                <th data-attr="date">Date
                </th>
                <th data-attr="resolved">Resolved
                </th>
                <th data-attr="dateresolved">Date Resolved
                </th>
                <th data-attr="resolvedby">Resolved by
                </th>
                <th data-attr="datecreated">Date Created
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
   {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.Till.NetworkId)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TransactionType.Description)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TID)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TransactionId)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.CardNo)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ReceiptNo)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.SchemeType.Description)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Amount)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.TransactionDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.Resolved)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.ResolvedDate)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.User.EHLogin)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.CreatedDate)
                    </td>
                    <td>
                        @Html.ActionLink("Edit", "Edit", "TransactionsOnHold", new { id = item.TillTransactionsOnHoldUid_PK }, null)
                        @if (!item.Resolved)
     {
                            @Html.ActionLink("Resolve", "Resolve", "TransactionsOnHold", new { id = item.TillTransactionsOnHoldUid_PK }, null)
     }
                    </td>
                </tr>
   }
        </tbody>
    </table>
</div>
<script type="text/javascript">
    $(document).ready(function () {
        sort("#empTable", "Home", "_heldTransactionTable")
    });
</script>

的JQuery / AJAX:

function sort(tableid, controllername, actionname) {
    $(tableid).find( 'th' ).click(function () {
        var sortBy = $( this ).data("attr");

        $.ajax({
            cache: false,
            url: "/"+controllername+"/"+actionname,
            data: "{ 'sortBy': '" + sortBy + "' }",
            dataType: "html",
            type: "POST",
            async: "true",
            contentType: "application/json; charset=utf-8",
            dataFilter: function (data) { return data; },
            success: function (data) {
                $("#tablediv").html('');
                $("#tablediv").html(data);
            },
            error: function (xhr, ajaxOptions, thrownError) { alert(xhr.status); alert(thrownError); }
        });     
    })
}

控制器:

public PartialViewResult _heldTransactionTable(string sortBy)
{
        var tilltransactionsonhold =  db.TillTransactionsOnHold...

        if (sortBy == (string)Session["sortBy"])
        {
            switch (sortBy)
            {
                case "tillnetworkid":
                    tilltransactionsonhold = tilltransactionsonhold
                    .OrderBy(m => m.Till.NetworkId);
                    break;
                case "transactiontype":
                    tilltransactionsonhold = tilltransactionsonhold
                    .OrderBy(m => m.TransactionType.TransactionTypeUid_PK);
                    break;
                case "tid":
                    etc..etc..
            }
            Session["sortBy"] = "";
        }
        else
        {
            Session["sortBy"] = sortBy;
            switch (sortBy)
            {
                case "tillnetworkid":
                    tilltransactionsonhold = tilltransactionsonhold
                    .OrderByDescending(m => m.Till.NetworkId);
                    break;
                case "transactiontype":
                    tilltransactionsonhold = tilltransactionsonhold
                    .OrderByDescending(m => m.TransactionType.TransactionTypeUid_PK);
                    break;
                case "tid":
                    etc...etc...
            }       
        }

        return PartialView(tilltransactionsonhold.ToList());
    }

你会注意到我删除的一些代码以节省阅读时间,我也很欣赏它不是最好的解决方案,这是一个学习练习,欢迎任何建议。

每次从数据库中新鲜过滤一个全新的数据模型会吸引广泛使用的应用程序,并且仅过滤模型本身会更有效。

我的问题是:在不严重修改现有代码的情况下,从部分视图将数据模型传递给控制器​​的好方法是什么,这样我就不必查询数据库了?

1 个答案:

答案 0 :(得分:0)

好吧,发回数据的HTML表示比无用更糟糕。你无能为力。人们通常会处理这种事情的方法是为记录它的“顺序”的每一行都有一个隐藏的输入,以及一个包含一些标识符的隐藏输入,以便能够确定将该顺序应用到哪个对象。你必须在排序改变时更新这个“订单”输入,但是任何好的库都应该有一些回调。

然后,您将发布这些字段值,这些字段值在AJAX中可以是JSON对象,也可以是x-www-form-urlencoded(您经常在URL中看到的名称 - 值对爵士,例如foo=1&bar=2)。在post操作中,您将使用id值查找相应的对象,然后将订单值应用于这些对象。然后,将更新保存回数据库。