使用jQuery发布回Controller

本文关键字:Controller 布回 jQuery 使用 | 更新日期: 2023-09-27 18:27:56

在我的网页中,我有一系列表,基本上只包含信息行。在for循环中,每一个都被赋予了一个id,我正试图从外部引用它们。我在表和"保存更改"按钮中都添加了类。

从本质上讲,我的目标是让用户能够四处拖放行,从而更改顺序。然后他们可以点击"保存更改"按钮,这将与相关信息一起发布回服务器。

我在将按钮与相关表匹配,从而将每一行的id提交回数组中的服务器时遇到了问题。我已经编写了代码,以便能够从每个表及其当前顺序中获取ID,但我不知道如何从单击jQuery按钮中将其分配给数组。

这是视图:

@foreach (var collection in Model.Collections)
{
    <h2>@collection.Season</h2>
    @Html.ActionLink("Delete Collection", "DeleteCollection", new { controller = "Edit", brand = collection.Brand.Name, season = collection.Season })
    @Html.ActionLink("Edit Collection", "EditCollection", new { controller = "Edit", brand = collection.Brand.Name, season = collection.Season })
    @Html.ActionLink("Add Image", "CreateImages", new { controller = "Edit", season = collection.Season })
    <p>
        To change the ordering of images, drag and drop to your desired position and then click the Save Changes button on the appropriate collection.
    </p>
    <table class="table-collection" id="table-@collection.Id">
        <tr class="nodrop nodrag">
            <th>
                Id
            </th>
            <th>
                Description
            </th>
            <th>
                Image
            </th>
            <th>
                Options
            </th>
        </tr>
    @foreach (var image in collection.Images)
    {       
        <tr id="@collection.Id-@image.Id">
            <td class="dragHandle showDragHandle"> 
                @image.Id
            </td>
            <td>
                @image.Description
            </td>
            <td>
                <img src="@Url.Content("~/" + image.Location)" alt="@image.Description" />
            </td>
            <td>
                <ul>
                    <li>
                        @Html.ActionLink("Edit", "EditImage", new { controller = "Edit", brand = image.Collection.Brand.Name,
                            season = image.Collection.Season, imageId = @image.Id } )
                    </li>
                    <li>
                        @Html.ActionLink("Delete", "DeleteImage", new
                        {
                            controller = "Edit",
                            brand = image.Collection.Brand.Name,
                            season = image.Collection.Season,
                            imageId = @image.Id
                        })
                    </li>                   
                </ul>
            </td>                
        </tr>   
    }
    </table>
    <p>
        <input type="submit" value="Save Changes" class="save-order" id="saveTable-@collection.Id"/> 
    </p>
}

以下是迄今为止的jQuery:

$(document).ready(function () {
    $(".table-collection").tableDnD();
    $(".save-order").click(function (e) {
        e.preventDefault();
        $.ajax({ url: window.location.href,
            type: 'POST',
            data: { ids: $("--ASSIGN ARRAY HERE--"
});

迭代每一行的jQuery本质上是这样的:

 function(table, row) {
        var rows = table.tBodies[0].rows;
        var debugStr = "Row dropped was "+row.id+". New order: ";
        for (var i=0; i<rows.length; i++) {
            debugStr += rows[i].id+" ";
        }

使用jQuery发布回Controller

我看到您使用的是专门用于回发表单的输入类型submit。你需要做的是用这样的东西将每张表都包装成一个表格

@using(Html.BeginForm("Action", "Controller", new{ collectionId = collection.Id }))
{
    <input type="submit" value="Save Changes" class="save-order" /> 
}

请注意,这将导致表单"张贴回"Action,Controller。在路由值中指定集合id以标识特定集合。

请注意,您需要使用id的值添加隐藏的输入类型,否则id将不会串行化-您只需要指定名称属性

<td class="dragHandle showDragHandle"> 
    <input type="hidden" name="ids" value="@(image.Id)" />
    @image.Id
</td>

然后您可以拦截该调用,然后通过ajax使用进行调用

$(".save-order").click(function(e) {
    e.preventDefault();
    var form = $(this).closest('form');
    if(form.validate()) {
        $.post(form.attr('action'), form.serialize(), function() {
        alert('The new image order has been saved.');
        });
    }
    return false;
});

接受控制器操作方法可能具有此签名

public ActionResult Action(int collectionId, int[] ids)
{
    //Do stuff here
    return Request.IsAjaxRequest() ? null : View();
}

现在,如果javascript被禁用,它应该支持优雅的降级(正常表单提交,否则通过ajax提交)

希望这有帮助:)

您可以通过以下方式获取所有ID:

var IDs = []; 
$("#mydiv").find("span").each(function(){ IDs.push(this.id); });

在你的场景中,做这样的事情:

$(document).ready(function () 
{ 

$(".table-collection").tableDnD();      
  $(".save-order").click(function (e) 
  { 
var IDs = [];
$("#yourtable").find("draggable-tr-class").each(function(){ IDs.push(this.id); });
e.preventDefault();  
$.ajax(
  { 
    url: window.location.href,             
    type: 'POST',             
    data: { ids: IDs }
);

}})

我一直在使用json在jsfiddle中创建演示http://jsfiddle.net/viyancs/4ffb3/11/如果你在服务器中使用类似的demo,那么必须获取参数"JSONFile",然后解析这个json以获得你想要的东西。实际上,这个demo与你的情况不一样,但我认为你可以根据你的逻辑使用它。