Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 表单反序列化不起作用_C#_Asp.net_Asp.net Mvc_Json_Http Post - Fatal编程技术网

C# 表单反序列化不起作用

C# 表单反序列化不起作用,c#,asp.net,asp.net-mvc,json,http-post,C#,Asp.net,Asp.net Mvc,Json,Http Post,我有一个异步httpPost,它序列化我的表单数据并将其提交给我的控制器。在那里,我尝试将表单数据序列化到视图模型类中,但所有值都为null或指定了默认值 public ActionResult GetSalesData(string vmString) { -serialization... -use the data to select some other data return new JsonResult { Data = d, JsonRequestBehav

我有一个异步httpPost,它序列化我的表单数据并将其提交给我的控制器。在那里,我尝试将表单数据序列化到视图模型类中,但所有值都为null或指定了默认值

public ActionResult GetSalesData(string vmString)
{
    -serialization...
    -use the data to select some other data
    return new JsonResult { Data = d, JsonRequestBehavior = JsonRequestBehavior.AllowGet };
}
对于序列化,我尝试了以下两种方法:

1.)

结果:

Dataset.Ids=3,7,12&Type=Sales&DataSources=BeverageType&DisplayModes=Volume&SeriesTypes=Lines&SalesVm.DisplayOptions.ShowAverage=false&SalesVm.DisplayOptions.ShowTargetLine=false&ActionName=Sales_SelectBeverageTypes&Mode=LightboxInWizard&SelectedDatasetIdsWorkingCopy=3&SearchTerm=
(二)

结果:

{"length":2,"prevObject":{"0":{"jQuery1710039964356962994385":1,"location":{}},"context":{"jQuery1710039964356962994385":1,"location":{}},"length":1},"context":{"jQuery1710039964356962994385":1,"location":{}},"selector":"form","0":{"Dataset.Ids":{},"Type":{},"DataSources":{"jQuery1710039964356962994385":15},"3":{"jQuery1710039964356962994385":16},"DisplayModes":{"0":{"jQuery1710039964356962994385":42},"1":{"jQuery1710039964356962994385":43},"2":{"jQuery1710039964356962994385":44},"3":{"jQuery1710039964356962994385":45}},"SeriesTypes":{"0":{"jQuery1710039964356962994385":46},"1":{"jQuery1710039964356962994385":47}},"SalesVm.DisplayOptions.ShowAverage":{"0":{"jQuery1710039964356962994385":48},"1":{"jQuery1710039964356962994385":49}},"SalesVm.DisplayOptions.ShowTargetLine":{"0":{"jQuery1710039964356962994385":50},"1":{"jQuery1710039964356962994385":51}}},"1":{"ActionName":{},"Mode":{},"SelectedDatasetIdsWorkingCopy":{},"SearchTerm":{"jQuery1710039964356962994385":35}}}
为了反序列化,我尝试:

m = (StatisticsViewerViewModel)new JsonSerializer().Deserialize(new System.IO.StringReader(vmString), typeof(StatisticsViewerViewModel));
m = (StatisticsViewerViewModel)new JsonSerializer().Deserialize(new System.IO.StringReader(vmString), vmString.GetType());
m = JsonConvert.DeserializeObject<StatisticsViewerViewModel>(vmString);

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(StatisticsViewerViewModel)); 
m = (StatisticsViewerViewModel) ser.ReadObject(stream);
我还检查了使用的视图模型以及所有嵌套模型是否有空构造函数

是否有不同的方法对表单数据进行反序列化/序列化?我还可以检查什么来确保一切都正常

  • 编辑-
ViewModel根目录:

public class StatisticsViewerViewModel
{
    public String BreadcrumbName { get; set; }
    public String ActionName { get; set; }
    public StatisticsType Type { get; set; }
    public DropDownListModel DataSourceList { get; set; }
    public MultiSelectionModel Dataset { get; set; }
    public SalesViewModel SalesVm { get; set; }
    //public EventsViewModel EventsVm { get; set; }
    public ChartExportOptions ExportOptions { get; set; }

    public StatisticsViewerViewModel()
    {
        DataSourceList = new DropDownListModel();
        Dataset = new MultiSelectionModel();
        SalesVm = new SalesViewModel();
        ExportOptions = new ChartExportOptions();
    }

    public enum StatisticsType
    {
        Sales,
        Events
    }
}
嵌套视图模型

public class SalesViewModel
{
    public SalesDisplayOptions DisplayOptions { get; set; }
    public RadioButtonModel DisplayModes { get; set; }      // Volume, Value, ..
    public RadioButtonModel SeriesTypes { get; set; }       // Line, Bar, ..

    public SalesViewModel(bool initialize = false)
    {
        if (initialize) { Initialize(); }
    }
}

public class SalesDisplayOptions
{
    public DisplayMode Mode { get; set; }
    public SeriesType Type { get; set; }
    public bool ShowAverage { get; set; }
    public bool ShowTargetLine { get; set; }

    public enum SeriesType
    {
        Lines, ...
    }

    public enum DisplayMode
    {
        Value, ...
    }

}
一个相关的观点可能是,该职位被肯多恰特解雇了。这里是视图中有趣的块:

....
<div id="chart"></div>
....
@this.ScriptBlock(
@<script type="text/javascript">
$("#chart").kendoChart({
             dataSource: new kendo.data.DataSource({
                 transport: {
                     read: {
                         url: actionUrl,
                         data: { vmString: $('form').serialize() },
                         dataType: "json",
                         contentType: "application/json; charset=utf-8"
                     }
                 },
                 sort: ...
 ....
。。。。
....
@这是一个脚本块(
@
$(“#图表”)。肯多卡特({
数据源:新建kendo.data.dataSource({
运输:{
阅读:{
url:actionUrl,
数据:{vmString:$('form').serialize()},
数据类型:“json”,
contentType:“应用程序/json;字符集=utf-8”
}
},
排序:。。。
....
为了检查问题是否与kendoChart对象有关,我测试性地实现了一个手动POST:

....
<div class="round-corner-bottom-right">
        <button id="send-form" type="button">
            <span class="button-label">Send Form Data</span>
        </button>
</div>
....

@this.ScriptBlock(
@<script type="text/javascript">

     $('document').ready(function () {

        $('#send-form').on('click', function () {

             var data = $('form').serialize();

             $.ajax({
                 type: "POST",
                 url: actionUrl,
                 data: data,
                 cache: false,
                 success: function (returnData) {
                 }
             });

     }); // document ready
。。。。
发送表单数据
....
@这是一个脚本块(
@
$('document').ready(函数(){
$(“#发送表单”)。在('click',函数(){
var data=$('form').serialize();
$.ajax({
类型:“POST”,
url:actionUrl,
数据:数据,
cache:false,
成功:函数(返回数据){
}
});
});//文件准备就绪

在这种情况下,问题并不存在,所有值都按预期设置。因此kendoChart方法似乎存在问题。

您是否厌倦了使用默认模型绑定器来处理它,而不是尝试反序列化和自己管理它

所以

变成这样

public ActionResult GetSalesData(MyModel vmString)

根据我的经验,要将复杂的JS对象传递给Asp.net控制器操作并将数据序列化到viewmodel中,唯一简单的方法是首先在JS端上对对象进行预处理

本页介绍了该方法:

要查看数据,请执行以下操作:

$.post(URL, $.toDictionary({ ... }), function(response) { ... });
以下是jQuery.toDictionary插件的精简源:

/*!
* jQuery toDictionary() plugin
*
* Version 1.2 (11 Apr 2011)
*
* Copyright (c) 2011 Robert Koritnik
* Licensed under the terms of the MIT license
* http://www.opensource.org/licenses/mit-license.php
*/
(function (a) { if (a.isFunction(String.prototype.format) === false) { String.prototype.format = function () { var a = this; var b = arguments.length; while (b--) { a = a.replace(new RegExp("\\{" + b + "\\}", "gim"), arguments[b]) } return a } } if (a.isFunction(Date.prototype.toISOString) === false) { Date.prototype.toISOString = function () { var a = function (a, b) { a = a.toString(); for (var c = a.length; c < b; c++) { a = "0" + a } return a }; var b = this; return "{0}-{1}-{2}T{3}:{4}:{5}.{6}Z".format(b.getUTCFullYear(), a(b.getUTCMonth() + 1, 2), a(b.getUTCDate(), 2), a(b.getUTCHours(), 2), a(b.getUTCMinutes(), 2), a(b.getUTCSeconds(), 2), a(b.getUTCMilliseconds(), 3)) } } var b = function (c, d, e, f) { if (a.isPlainObject(c)) { for (var g in c) { if (f === true || typeof c[g] !== "undefined" && c[g] !== null) { b(c[g], d, e.length > 0 ? e + "." + g : g, f) } } } else { if (a.isArray(c)) { a.each(c, function (a, c) { b(c, d, "{0}[{1}]".format(e, a)) }); return } if (!a.isFunction(c)) { if (c instanceof Date) { d.push({ name: e, value: c.toISOString() }) } else { var h = typeof c; switch (h) { case "boolean": case "number": h = c; break; case "object": if (f !== true) { return }; default: h = c || "" } d.push({ name: e, value: h }) } } } }; a.extend({ toDictionary: function (c, d, e) { c = a.isFunction(c) ? c.call() : c; if (arguments.length === 2 && typeof d === "boolean") { e = d; d = "" } e = typeof e === "boolean" ? e : false; var f = []; b(c, f, d || "", e); return f } }) })(jQuery)
/*!
*jQuery toDictionary()插件
*
*版本1.2(2011年4月11日)
*
*版权所有(c)2011罗伯特·科里特尼克
*根据麻省理工学院许可证的条款获得许可
* http://www.opensource.org/licenses/mit-license.php
*/
函数(a){if(a.isFunction(String.prototype.format)==false){String.prototype.format=function(){var a=this;var b=arguments.length;而(b--){a=a.replace(new RegExp(\\{+b+“\\\}”,“gim”),arguments[b])返回a}}if(a.isFunction(Date protoisotype.toISOString)==false){Date protoisostring.toISOString=function()(var a)a{a{var a{a{a{a{a{a{var a=函数(a,b)a{a{0“a}”返回a};var b a=函数(a,b)b=函数(a,b)b=函数(a,b)a,b{a,b(a,b{a,b{a,b{a,b{a,b{a(a,b{a,b{a,b{a,b{a{a{a{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{1{1}{1}{1}{1}{1}{1}{1}{1}{1}{1}{2}{1}{2}Cmilliseconds(),3))}(c)c)c(f==真实(f===真实(f==真实(f===);c(c)的类型c[g]的[c]的[c]的[c]的[c]的)类型(c)的[g]!=“未定义的”以及c[c[g,e,e,e,f,e,f,f,f,f)f(若)c)b(b(c(c,c,d,d,d,d,d,e,f,f,f,f,f),f)f)f(c,f){{{{(c)b(c)b(c)b(c)b(c,c,c,c,c,c,c,c,c,c,c,c,c,d,c,c,c,c,c,c,d,c,c,c,c,c,c,d,d,e,e,e,e,e,e,e,e,e{d.push({name:e,value:c.toISOString()})else{var h=c的类型;switch(h){case“boolean”:case“number”:h=c;break;case“object”:if(f!==true){return};default:h=c | |“}d.push({name:e,value:h}}}}}});a.extend({toDictionary:function:function(c,d,e,e){c=a.isFunction){c.call(arguments.length==2&&typeof d==“boolean”){e=d;d=”“}e=typeof e===“boolean”?e:false;var f=[];b(c,f,d | | |,e);返回f}})(jQuery)

问题不在于反序列化过程本身,而在于数据如何绑定到kendoChart的数据源中。问题的解决方案是指定一个带有ajax post的函数作为数据源,如下所示:

var data = $('form').serialize();

$("#chart").kendoChart({
             title: {
                 text: "Solution"
             },
             dataSource: new kendo.data.DataSource({
                 transport: {
                     read: function (options){
                         $.ajax({
                             url: actionUrl,
                             data: data,
                             type: "POST",
                             cache: false,
                             success: function (result) {
                                 options.success(result);
                             }
                         });
                     }
                 },
                 ....

很抱歉用错误的问题打扰您!

是的,我也试过了,很抱歉我忘了提及它。然后整个对象为空。您是否将模型的PK作为隐藏字段包含?我没有任何PK,因为我的视图模型没有直接连接到DB。我将发布我的VM。好的,我们可以查看您的视图模型定义和视图吗?我将虚拟机添加到原始post是否可以发布您的Viewmodel C#和.aspx标记?您所追求的功能内置到MVC模型绑定器中。如果我们可以让您的代码使用它,而不是滚动自己的代码,这将为您节省很多麻烦。@David您需要发布您的虚拟机和视图代码。我一直都在这样做t次工作没有问题,我在Vm或数据集合中有Vm并绑定。你可以尝试serializeArray();你也在使用html帮助程序吗?好的!这是我的Vm。我希望它有帮助
public ActionResult GetSalesData(MyModel vmString)
$.post(URL, $.toDictionary({ ... }), function(response) { ... });
/*!
* jQuery toDictionary() plugin
*
* Version 1.2 (11 Apr 2011)
*
* Copyright (c) 2011 Robert Koritnik
* Licensed under the terms of the MIT license
* http://www.opensource.org/licenses/mit-license.php
*/
(function (a) { if (a.isFunction(String.prototype.format) === false) { String.prototype.format = function () { var a = this; var b = arguments.length; while (b--) { a = a.replace(new RegExp("\\{" + b + "\\}", "gim"), arguments[b]) } return a } } if (a.isFunction(Date.prototype.toISOString) === false) { Date.prototype.toISOString = function () { var a = function (a, b) { a = a.toString(); for (var c = a.length; c < b; c++) { a = "0" + a } return a }; var b = this; return "{0}-{1}-{2}T{3}:{4}:{5}.{6}Z".format(b.getUTCFullYear(), a(b.getUTCMonth() + 1, 2), a(b.getUTCDate(), 2), a(b.getUTCHours(), 2), a(b.getUTCMinutes(), 2), a(b.getUTCSeconds(), 2), a(b.getUTCMilliseconds(), 3)) } } var b = function (c, d, e, f) { if (a.isPlainObject(c)) { for (var g in c) { if (f === true || typeof c[g] !== "undefined" && c[g] !== null) { b(c[g], d, e.length > 0 ? e + "." + g : g, f) } } } else { if (a.isArray(c)) { a.each(c, function (a, c) { b(c, d, "{0}[{1}]".format(e, a)) }); return } if (!a.isFunction(c)) { if (c instanceof Date) { d.push({ name: e, value: c.toISOString() }) } else { var h = typeof c; switch (h) { case "boolean": case "number": h = c; break; case "object": if (f !== true) { return }; default: h = c || "" } d.push({ name: e, value: h }) } } } }; a.extend({ toDictionary: function (c, d, e) { c = a.isFunction(c) ? c.call() : c; if (arguments.length === 2 && typeof d === "boolean") { e = d; d = "" } e = typeof e === "boolean" ? e : false; var f = []; b(c, f, d || "", e); return f } }) })(jQuery)
var data = $('form').serialize();

$("#chart").kendoChart({
             title: {
                 text: "Solution"
             },
             dataSource: new kendo.data.DataSource({
                 transport: {
                     read: function (options){
                         $.ajax({
                             url: actionUrl,
                             data: data,
                             type: "POST",
                             cache: false,
                             success: function (result) {
                                 options.success(result);
                             }
                         });
                     }
                 },
                 ....