如何使用mvc表单提交发布JSON数据?

时间:2015-07-30 19:01:42

标签: c# jquery .net asp.net-mvc form-submit

我的视图中隐藏了包含Json格式数据的字段。我想使用表单提交发布此数据。我不能用ajax。

<input type="hidden" id="workData" name="Works" data-value="[{"Id":44,"Body":"Completion Status","IsCompleted":true},{"Id":11,"Body":"Completion details","IsCompleted":false}]" value="{"Id":"33","Body":"Status","IsCompleted":true}">

<input type= "hidden" name ="Name" value="Micheal">

我有员工模型和工作模型。每位员工都被分配了工作清单。

public class Employee
{
    public string Name {get; set;}
    public List<Work> Works {get; set;} 
}

public class Work 
{
    public string Body {get; set;}
    public boll IsCompleted{get; set;}
}

我的动作方法签名就是这个

public ActionResult SetWorkStatus(Employee employee)

如何将此数据发布到操作中?

2 个答案:

答案 0 :(得分:1)

当我无法使用ajax时,我遇到了类似的问题。所以这就是我设法让它发挥作用的方式。

首先使用单引号data-value替换' '属性周围的双引号

然后您必须在表单中附加隐藏的输入。然后它们将正确绑定到您的模型。

要绑定复杂对象,您需要为每个项目提供索引,而不是依赖于项目的顺序。这可以确保我们可以明确地将提交的属性与正确的对象进行匹配。

@using (Html.BeginForm("SetWorkStatus", "Controller", FormMethod.Post))
{
   @Html.HiddenFor(e => e.Name)
   <input type="hidden" id="workData" data-value='[{"id":44,"body":"completion status","iscompleted":true},{"id":11,"body":"completion details","iscompleted":false}]' value='{"id":"33","body":"status","iscompleted":true}'>
   <input type="submit" value="submit" />
}

@section scripts{
<script type="text/javascript">

    $(function () {



        $("input:submit")
        .on("click", function () {

            var str = JSON.stringify($("#workData").data("value"));
            var data = JSON.parse(str).map(function (e) {
                return { Body: e.body, IsCompleted: e.iscompleted };
            });

            data.forEach(function (e, i) {

                $("form").append("<input type='hidden' name='Employee.Works[" + i + "].Body' value='" + e.Body + "' />" +
                                 "<input type='hidden' name='Employee.Works[" + i + "].IsCompleted' value='" + e.IsCompleted + "' />");

            });

        });

    });

</script>

}

请注意,索引必须是从0开始的不间断整数序列,并且每个元素都会增加1。

请参阅model binding to list

答案 1 :(得分:0)

MVC模型绑定器不知道如何将Work输入的JSON值转换为模型。您可以尝试的一件事是更改您的POST模型以使用Works的字符串,然后在您的操作中解析JSON。

public class PostEmployeeModel
{
    public string Name {get; set;}
    public string Works {get; set;} 
}

[HttpPost]
public ActionResult SetWorkStatus(PostEmployeeModel employee)
{
    Work work = JsonConvert.DeserializeObject<Work>(employee.Works)
    // ...
}