通过post正确接收嵌套对象

时间:2018-06-05 13:41:10

标签: asp.net asp.net-mvc

我正在尝试将复杂对象作为表单对象发送到mvc控制器。但是我只收到一个带有默认值的new对象。

这是对象(只是稍微修整一下以使示例更简单)

public class AddProjectPopupModel
{
    public long SelectedCountryId;

    public Project ResultProject { get; set; }
}

public class Project
{
    public long Number;

    public string Name;
}

以下是我创建表单的方式:

@using (Html.BeginForm("AddProjectResult", "Popups", FormMethod.Post, new { id = "addProjectForm"}))
{
    @Html.EditorFor(model => model.ResultProject.Number, new { htmlAttributes = new { Id = "number", Class = "validate", Value = 0 } })
    @Html.EditorFor(model => model.ResultProject.Name, new { htmlAttributes = new { Id = "name", Class = "validate" } })
}

现在我有一个调用以下javascript的按钮:

var form = $("#addProjectForm");
var data = form.serialize();
var url = form.attr('action');
$.ajax({
    type: "POST",
    url: url,
    data: data,
    success: function(result) {
        debugger;
    }
});

控制器:

[HttpPost]
public ActionResult AddProjectResult(AddProjectPopupModel model)
{
    return Json(new { Success = true });
}

我也尝试将控制器参数更改为:

public ActionResult AddProjectResult(long SelectedCountryId, Project ResultProject)

此处SelectedCountryId被正确填充,但不是项目。

我希望将整个AddProjectPopupModel用作参数,而不是它的具体值。

但是我无法理解这一点。

电话的提琴手输出:

ResultProject.Number=2&ResultProject.Name=awd&ResultProject.Location=awdawd&SelectedCountryId=2

控制器中的调试器值:

SelectedCountryId: 2; ResultProject.Number: 0,...

1 个答案:

答案 0 :(得分:1)

您的问题是,在您的项目对象中,您正在使用文件

public class Project
{
    public long Number;

    public string Name;
}

它们应该是属性,以便可以导航到

public class Project
{
    public long Number { get; set; }

    public string Name { get; set; }
}

这应该有效

我建议您阅读Model Binding以获取更多信息