通过post asp.net mvc将webgrid数据传递回控制器

时间:2014-02-18 08:44:57

标签: asp.net-mvc webgrid

我是MVC的新手,想知道如何使用viewmodel立即提交提交按钮上的整个网格数据点击控制器。

在视图中

@model prjMVC4Training.Models.BookViewModel
@{
    ViewBag.Title = "Index";
    var categories = ViewBag.BookCategories;
    var authors = ViewBag.BookAuthors;
    var grid = new WebGrid(source: Model.BookData, canSort: true, canPage:true);    
}

@using (Html.BeginForm("BookPost", "Book", FormMethod.Post, new { @id = "grid" }))
{
    <h2>Book Index Page</h2>    
    @Html.HiddenFor(m => m.PrimaryKeyID)

    @grid.GetHtml(
        tableStyle: "table",
        alternatingRowStyle: "alternate",
        selectedRowStyle: "selected",
        headerStyle: "header",
        columns: grid.Columns(
            grid.Column("Actions",
                style: "col1",
                canSort: false,
                format: @<text>
                    <button type="button"  class="edit-book display-mode" id="@item.BookID">Edit</button>
                    <button type="button" class="save-book edit-mode" id="@item.BookID">Save</button>
                    <button type="button" class="cancel-book edit-mode" id="@item.BookID">Cancel</button>
                    </text>),
                grid.Column("BookTitle",
                    style: "col2",
                    canSort: true,
                    format: @<text>
                        <span id="dBookTitle" class="display-mode">@item.BookTitle</span>
                        @Html.TextBox("BookData_" + (int)item.BookID + "__BookID", (string)item.BookTitle, new { @class = "edit-mode", size = 45 })
                        </text>),
                grid.Column("AuthorName",
                    header: "Author",
                    style: "col3",
                    canSort: true,
                    format: @<text>
                        <span id="dAuthorName" class="display-mode">@item.AuthorName</span>
                        @Html.DropDownList("AuthorID_" + (int)item.BookID, (ViewBag.BookAuthors as SelectList).Select(option => new SelectListItem
                        {
                            Text = option.Text,
                            Value = option.Value,
                            Selected = option.Value == @item.AuthorID
                        }), new { @class = "edit-mode" })
                        </text>),
                grid.Column("CategoryName",
                style: "col4",
                canSort: true,
                    format: @<text>
                        <span id="dCategoryName" class="display-mode">@item.CategoryName</span>
                        @Html.DropDownList("CategoryID_" + (int)item.BookID, (ViewBag.BookCategories as SelectList).Select(option => new SelectListItem
                        {
                            Text = option.Text,
                            Value = option.Value,
                            Selected = option.Value == @item.CategoryID
                        }), new { @class = "edit-mode" })
                        </text>),
                grid.Column("BookISBN",
                    style: "col5",
                    format: @<text>
                        <span id="dBookISBN" class="display-mode">@item.BookISBN</span>
                        @Html.TextBox("BookISBN_" + (int)item.BookID, (string)item.BookISBN, new { @class = "edit-mode", size = 20 })
                        </text>),
                grid.Column("IsMember",
                    style: "",
                    format: @<text>
                        <span id="dMember" class="display-mode">@item.IsMember</span>
                        <input type="checkbox" id="MemberID_" + (int)item.BookID name="MemberID" @(item.IsMember == true ? "Checked" : null) class="edit-mode"/>
                        </text>)))    
    <button type="submit" value="Save Book Data">Save Book Data</button>
}

在提交按钮上,我想将值传递给控制器​​

[HttpPost]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult BookPost(BookViewModel obj)
{
    ViewBag.BookCategories = new SelectList(BookHelperData.GetBookCategories(), "CategoryID", "CategoryName", "20");
    ViewBag.BookAuthors = new SelectList(BookHelperData.GetAuthors(), "AuthorID", "AuthorName");
    //ViewBag.BookAuthors = BookHelperData.GetAuthorsList();
    var Book = BookHelperData.GetBooks();
    return View(Book);

}

我的ViewModel类是这样的 -

public class BookViewModel
{
    public int PrimaryKeyID { get; set; }
    public List<Book> BookData { get; set; }
}

1 个答案:

答案 0 :(得分:2)

您可以编写一个循环方法,循环网格中的所有数据并将其转换为json结构。

function gridTojson() {
        var json = '{';
        var otArr = [];
        var tbl2 = $('#employeeGrid tbody tr').each(function (i) {
            if ($(this)[0].rowIndex != 0) {
                x = $(this).children();
                var itArr = [];
                x.each(function () {
                    if ($(this).children('input').length > 0) {
                        itArr.push('"' + $(this).children('input').val() + '"');
                    }
                    else {
                        itArr.push('"' + $(this).text() + '"');
                    }
                });
                otArr.push('"' + i + '": [' + itArr.join(',') + ']');
            }
        })
        json += otArr.join(",") + '}'
        return json;
    }

现在点击提交按钮,您需要将数据传递给控制器​​。

$('#btnsave').click(function (e) {
        //debugger;
        var _griddata = gridTojson();
        var url = '@Url.Action("UpdateGridData")';
            $.ajax({
                url: url,
                type: 'POST',
                data: { gridData: _griddata }
            }).done(function (data) {
                if (data != "") {
                    $('#message').html(data);
                }
            });
     });

现在在控制器上序列化数据

public ActionResult UpdateGridData(string gridData)
        {
            var log = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, string[]>>(gridData);     
            return Json("Update Successfully");
        }

以下是关于此问题的post

相关问题