我的视图中隐藏了包含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)
如何将此数据发布到操作中?
答案 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。
答案 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)
// ...
}