asp.net-mvc - 如何提交本地jqgrid数据和表单输入元素

标签 asp.net-mvc jqgrid submit

页面包含带有输入元素和 jqgrid 数据的单个表单。 使用 loadonce: true 选项以 json 形式检索 jqGrid 数据。 数据在本地编辑。

如果按下提交按钮,如何提交所有这些数据? jqGrid 有任何方法可以帮助提交所有行的所有数据。 jqGrid - How to edit and save multiple rows at once?提到应该使用 jQuery ajax 表单插件,但我还没有找到任何示例。

jqGrid 可能在元素中保存检索到的 json 表。在这种情况下,表单插件无法读取此数据。

如何获取并提交使用 loadonce: true 检索并编辑的所有数据?

更新1

根据我尝试过的奥列格回答:

function SaveDocument()  {
  var gridData = $("#grid").jqGrid('getGridParam','data');
  var postData = JSON.stringify(gridData);    
  $('#_detail').val( postData );
  var res = $("#Form").serializeArray();
  $.ajax({ type: "POST",        
  url: 'Edit'
  data : res
  });
   }
}

aspx页面:

<form id="Form" class='form-fields'>
.... other form fields
<input name='_detail' id='_detail' type='hidden' />
</form>
<div id="grid1container" style="width: 100%">
   <table id="grid">
   </table>
</div>

在 ASP.NET MVC2 Controller 编辑方法中,我尝试使用解析结果

public JsonResult Edit(string _detail) {

var order = new Order();
UpdateModel(order, new HtmlDecodeValueProviderFromLocalizedData(ControllerContext));

var serializer = new JavaScriptSerializer();
var details = serializer.Deserialize<List<OrderDetails>>>(_detail);
}

Deserialize() 调用中发生异常。小数和日期属性以本地化格式传递,但看起来 Deserialize() 无法解析 本地化字符串,并且无法强制它使用像传递给 UpdateModel 的 HtmlDecodeValueProviderFromLocalizedData 这样的转换器。

如何解决? 是否合理/如何将 _detail 参数转换为 NameValue 集合,然后使用 UpdateModel 更新详细信息,使用其他反序列化或其他想法?

更新2。

小数和日期 CurrentUICulture 值存在于表单和 jqGrid 数据中。提供的示例可以正常处理它们,但对于 jqGrid 数据则失败。 该 Controller 应该处理可以在运行时定义的不同实体类型、表单字段和 jqgrid 列。因此使用硬编码名称是不可能的。 根据奥列格的回复,我尝试通过创建转换器来覆盖十进制转换

public class LocalizedTypeConverter : JavaScriptConverter
{
    public override IEnumerable<Type> SupportedTypes
    {
        get
        {
            return new ReadOnlyCollection<Type>(new Type[] { typeof(decimal) });
        }
    }

    public override object Deserialize(IDictionary<string, object> dictionary, Type type,
            JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            throw new ArgumentNullException("dictionary");
        if (type == typeof(decimal))
            return decimal.Parse(dictionary["resources"].ToString(), CultureInfo.CurrentCulture);
        return null;

    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new InvalidOperationException("We only Deserialize");
    }
}

但是转换仍然会引发异常

0,0000 不是有效的小数值。看起来十进制转换器无法覆盖。如何修复?

最佳答案

首先你可以从jqGrid获取所有本地数据

var localGridData = $("#list").jqGrid('getGridParam','data');

如果您只需要发送网格行的子集(例如仅选定的行),您可能需要获取_index:

var idsToDataIndex = $("#list").jqGrid('getGridParam','_index');

要将数据发送到服务器,您可以使用以下函数,例如

var sendData = function(data) {
    var dataToSend = JSON.stringify(data);
    alert("The following data are sending to the server:\n" + dataToSend);
    $.ajax({
        type: "POST",
        url: "yourServerUrl",
        dataType:"json",
        data: dataToSend,
        contentType: "application/json; charset=utf-8",
        success: function(response, textStatus, jqXHR) {
            // display an success message if needed
            alert("success");
        },
        error: function(jqXHR, textStatus, errorThrown) {
            // display an error message in any way
            alert("error");
        }
    });
};

the demo您会发现一个更复杂的示例,有两个按钮:“发送所有网格包含”,“发送选定的行”。对应的代码如下

$("#sendAll").click(function(){
    var localGridData = grid.jqGrid('getGridParam','data');
    sendData(localGridData);
});
$("#sendSelected").click(function(){
    var localGridData = grid.jqGrid('getGridParam','data'),
        idsToDataIndex = grid.jqGrid('getGridParam','_index'),
        selRows = grid.jqGrid('getGridParam','selarrrow'),
        dataToSend = [], i, l=selRows.length;
    for (i=0; i<l; i++) {
        dataToSend.push(localGridData[idsToDataIndex[selRows[i]]]);
    }
    sendData(dataToSend);
});

哪里

var grid = $("#list"),
    decodeErrorMessage = function(jqXHR, textStatus, errorThrown) {
        var html, errorInfo, i, errorText = textStatus + '\n<br />' + errorThrown;
        if (jqXHR.responseText.charAt(0) === '[') {
            try {
                errorInfo = $.parseJSON(jqXHR.responseText);
                errorText = "";
                for (i=0; i<errorInfo.length; i++) {
                   if (errorText.length !== 0) {
                       errorText += "<hr/>";
                   }
                   errorText += errorInfo[i].Source + ": " + errorInfo[i].Message;
                }
            }
            catch (e) { }
        } else {
            html = /<body.*?>([\s\S]*)<\/body>/i.exec(jqXHR.responseText);
            if (html !== null && html.length > 1) {
                errorText = html[1];
            }
        }
        return errorText;
    },
    sendData = function(data) {
        var dataToSend = JSON.stringify(data);
        alert("The following data are sending to the server:\n"+dataToSend);
        $.ajax({
            type: "POST",
            url: "yourServerUrl",
            dataType:"json",
            data: dataToSend,
            contentType: "application/json; charset=utf-8",
            success: function(response, textStatus, jqXHR) {
                // remove error div if exist
                $('#' + grid[0].id + '_err').remove();
                alert("success");
            },
            error: function(jqXHR, textStatus, errorThrown) {
                // remove error div if exist
                $('#' + grid[0].id + '_err').remove();
                // insert div with the error description before the grid
                grid.closest('div.ui-jqgrid').before(
                    '<div id="' + grid[0].id + '_err" style="max-width:' + grid[0].style.width +
                    ';"><div class="ui-state-error ui-corner-all" style="padding:0.7em;float:left;"><span class="ui-icon ui-icon-alert" ' +
                    'style="float:left; margin-right: .3em;"></span><span style="clear:left">' +
                    decodeErrorMessage(jqXHR, textStatus, errorThrown) + '</span></div><div style="clear:left"/></div>');
            }
        });
    };

我认为,您将在服务器上遇到更困难和更复杂的问题。如果出现并发错误,但我之前写过有关问题的文章。正是由于这些问题,我个人永远不会在服务器上实现多行保存。

更新:要从表单中获取数据,您可以使用 jQuery.serialize 。您应该对要序列化的表单中的所有字段使用 name 属性。您需要发送的所有数据是

var allData = {
    localGridData: grid.jqGrid('getGridParam','data'),
    formData: $("#formid").serialize()
};

您可以像我之前描述的那样发送数据:sendData(allData)

关于asp.net-mvc - 如何提交本地jqgrid数据和表单输入元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6798671/

相关文章:

javascript - JQuery 提交函数有时工作

asp.net - Web配置转换为自定义部分

css - 具有指定 HTML id 的 Html.ActionLink?

grails - 在jqgrid中:我想显示一个没有分页的空网格,如果没有记录,则显示一条消息 “no records found”

jquery - 如何在顶部工具栏中向 jqgrid pager 添加快捷键

jqgrid - 如何上传图片到jqgrid列

javascript - 使用 javascript 进行文本框验证

JQuery函数submit()不提交表单

asp.net-mvc - 来自数据库的动态 MVC Razor 模型

css - MVC 5 和 Bootstrap 3.3.5