将 JSON 传递给控制器​​ MVC3 C# .NET

Passing JSON to Controller MVC3 C# .NET

我正在尝试将我的数据 (json) 从视图通过 ajax 传递到我的控制器,但结果为空。提前感谢任何帮助或建议。

这是我的模型。

public class TipificacionModel
{
    public int Existente { get; set; }
    public string Campo { get; set; }
    public int Regla { get; set; }

}

public class ListasSeleccionModel{
    public List<string> DatosSeleccion { get; set; }
}

public class ListaTipificaciones
{
    public string NombreCampaña { get; set; }
    public List<TipificacionModel> Tipificacion { get; set; }
}

public class DatosSeleccionMultiple
{
    public List<String> Columnas { get; set; }
    public List<ListasSeleccionModel> ListasSeleccion { get; set; }
}

public class TipificacionGeneralCampaña
{
    public ListaTipificaciones CamposCreados { get; set; }
    public List<DatosSeleccionMultiple> ListasDeSeleccion { get; set; }

}

这是我的 ajax 函数。

        jsonListaGeneral = [];

        jsonListaGeneral.push(jsonTipificacion);
        jsonListaGeneral.push(jsonListasSeleccion);

        console.log(jsonListaGeneral);

        $.ajax({
            url: '@Url.Action("crearCampManual", "DPS")',
            type: 'post',
            data: JSON.stringify(jsonListaGeneral),
            contentType: 'application/json; charset=utf-8;',
            dataType: 'json',
            success: function (response) {
                alert(response)
                return;
            },
            error: function (x) {
                alert(x.responseText);
            }
        });

这是我的控制器。

    [HttpPost]
    public ActionResult crearCampManual(TipificacionGeneralCampaña model)
    { //Here the model value is null, why?}

当我在浏览器控制台中打印 json 时,一切正常。但是发生了一些不好的事情,我做错了。

Console Browser

Break Point Controller

一个问题是您通过 AJAX 调用发送的数据似乎是一个数组:

jsonListaGeneral = [];

但是您的 C# 模型不是数组或集合:

public ActionResult crearCampManual(TipificacionGeneralCampaña model)

如果您要从 AJAX 向 C# 控制器发送 TipificacionGeneralCampaña 对象数组,那么您希望控制器定义如下所示:

public ActionResult crearCampManual(List<TipificacionGeneralCampaña> model)

还要重申@Hackereman 在他的评论中所说的内容,在将数据传递给控制器​​之前,您不需要对数据使用 JSON.Stringify 函数:

$.ajax({
        url: '@Url.Action("crearCampManual", "DPS")',
        type: 'post',
        data: jsonListaGeneral,
        contentType: 'application/json; charset=utf-8;',
        dataType: 'json',
        success: function (response) {
            alert(response)
            return;
        },
        error: function (x) {
            alert(x.responseText);
        }
    });

我从您的控制台浏览器屏幕截图中注意到的另一个问题:您似乎在将两个不同的对象发送到您的控制器之前添加到同一个 JSON 数组:

    jsonListaGeneral.push(jsonTipificacion);
    jsonListaGeneral.push(jsonListasSeleccion);

在 C# 中创建集合时,集合中的所有对象都需要属于同一类型,这意味着它们具有相同的 属性 名称和 属性 类型。

根据您的 C# 控制器当前的设置方式,它将接受结构如下的 JSON 对象:

{
    CamposCreados : {
        NombreCampaña : "",
        Tipificacion : [
            {
                Existente  : 0,
                Campo : "",
                Regla : 0
            },
            {
                Existente  : 1,
                Campo : "",
                Regla : 1
            }
        ]
    }
    ListasDeSeleccion : [
        {
            Columnas : "",
            ListasSeleccion : [
                {
                    DatosSeleccion : [
                        {
                            "",
                            "",
                            ""
                        }
                    ]
                },
                {
                    DatosSeleccion : [
                        {
                            "",
                            "",
                            ""
                        }
                    ]
                }
            ]
        }
    ]
}

解决方案是更改 Json 对象的声明。

var jsonListaGeneral = {
    "CamposCreados": jsonTipificacion,
    "ListasDeSeleccion": jsonListasSeleccion
}