C# MVC Post 模型和从 js 到控制器的附加数据

Nat*_*ate 5 javascript c# asp.net asp.net-mvc jquery

我正在使用我正在创建的自定义工作流解决方案。我想创建一个具有模型的回发,以及两个代表我已完成的操作和步骤的整数值。我不想将它们添加到模型中,因为它们只在这个地方使用。此回发的签名将是这样的。

[HttpPost]
public void ProcessWorkflowAction(EditScreenModelValidation model, int stepActionId, int stepNumber)
{
    //Some work on model and actions
}
Run Code Online (Sandbox Code Playgroud)

我真的很想通过 JS 来做到这一点,因为这是目前我获取 StepActionId 和 StepId 的方式。有没有办法把模型打包通过JS发送?

 var modelObj = CreateModelData();
 var postObj = JSON.stringify(modelObj);
 $.ajax({
        type: "POST",
        traditional: true,
        dataType: "json",
        url: "url",
        data: { model: modelObj, stepActionId: stepId, stepNumber: 3 }
        cache: false,
        complete: function (data) {
        }});

CreateModelData = function () {
    var modelObj = {};
    var modelArray = $('#frm').serializeArray()
    $.each(modelArray, function (index, value) {
        assign(modelObj, value.name, value.value);
    })

    return modelObj;
};

function assign(obj, prop, value) {
    if (prop != undefined) {
        if (typeof prop === "string")
            prop = prop.split(".");

        if (prop.length > 1) {
            var e = prop.shift();
            assign(obj[e] =
                     Object.prototype.toString.call(obj[e]) === "[object Object]"
                     ? obj[e]
                     : {},
                   prop,
                   value);
        } else
            obj[prop[0]] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

该模型在控制器中返回为 null。我也尝试了以下代码,结果相同。

$.ajax({
        type: "POST",
        traditional: true,
        dataType: "json",
        url: "url",
        data: { model: $('#frm').serializeArray(), stepActionId: stepId, stepNumber: 3 }
        cache: false,
        complete: function (data) {
        }});
Run Code Online (Sandbox Code Playgroud)

Nat*_*ate 0

这就是我如何让它发挥作用的。CreateModelData 使用 (frm).serializeArray() 方法,但我发现如果该项目已禁用或不在页面上,则它不会创建该属性。

    var modelObj = CreateModelData();

    var postObj = JSON.stringify(modelObj);

    $.ajax({
        type: "POST",
        traditional: true,
        dataType: "json",
        url: "url",
        data: { modelString: postObj, stepActionId: stepId, stepNumber: 3 },
        cache: false,
        complete: function (data) {
        }});
});

CreateModelData = function () {
    var modelObj = {};
    var modelArray = $('#frm').serializeArray();
    $.each(modelArray, function (index, value) {
        assign(modelObj, value.name, value.value);
    })

    return modelObj;
};

function assign(obj, prop, value) {
    if (prop != undefined) {
        if (typeof prop === "string")
            prop = prop.split(".");

        if (prop.length > 1) {
            var e = prop.shift();
            assign(obj[e] =
                     Object.prototype.toString.call(obj[e]) === "[object Object]"
                     ? obj[e]
                     : {},
                   prop,
                   value);
        } else
            obj[prop[0]] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)

在控制器方面,我将签名更改为所有字符串值,如下所示。

[HttpPost]
public void ProcessWorkflow(string modelString, int stepActionId, int stepNumber)
{
}
Run Code Online (Sandbox Code Playgroud)

为了使 modelString 值成为实际的模型对象,我这样做了。

using (Stream s = GenerateStreamFromString(json))
{
    DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(modelObj));
    return (modelObj)serializer.ReadObject(s);
}
Run Code Online (Sandbox Code Playgroud)

最后,这对我有用。所有字段都在那里,我没有收到任何错误。当我尝试将控制器方法中的第一个变量作为模型对象时,无论我做什么,它总是返回为 null。