将表单发布序列化为控制器
Serialize form post to controller
Html:
<form id="testForm">
<div>
Customer 1
<input type="hidden" name="EmployeeId" value="1" />
<input type="checkbox" name="FirstName" value="10"> Test 10
<input type="checkbox" name="FirstName" value="20"> Test 20
<input type="checkbox" name="FirstName" value="30"> Test 30
<input type="checkbox" name="FirstName" value="40"> Test 40
<input type="checkbox" name="FirstName" value="50"> Test 50
<input type="checkbox" name="FirstName" value="60"> Test 60
</div>
<div>
Customer 2
<input type="hidden" name="EmployeeId" value="2" />
<input type="checkbox" name="FirstName" value="100"> Test 100
<input type="checkbox" name="FirstName" value="200"> Test 200
<input type="checkbox" name="FirstName" value="300"> Test 300
<input type="checkbox" name="FirstName" value="400"> Test 400
<input type="checkbox" name="FirstName" value="500"> Test 500
<input type="checkbox" name="FirstName" value="600"> Test 600
</div>
</form>
<button id="btn" type="button">Click</button>
JavaScript (jQuery(:
$('#btn').click(function () {
var objCustomer = {};
objCustomer.CustomerID = 22;
objCustomer.CompanyName = "Test Company";
var resultData = JSON.stringify({
EmployeeData: $('#testForm').serializeArray(), // I want to get testform data and set to "resultData"
CustomerData: objCustomer
});
var options = {};
options.url = "/Home/Post/";
options.type = "POST";
options.data = resultData;
options.dataType = "json";
options.contentType = "application/json";
options.success = function (result) { if (result != null) { { alert("Success"); } } };
options.error = function () { alert("Error"); };
$.ajax(options);
});
控制器:
public JsonResult Post(EmployeeCustomer data)
{
try
{
List<Employee> emp = data.EmployeeData;
Customer cust = data.CustomerData;
return Json(data, JsonRequestBehavior.AllowGet);
}
catch
{
return Json(false, JsonRequestBehavior.AllowGet);
}
}
客户.cs类
public int CustomerId { get; set; }
public string CompanyName { get; set; }
员工.cs类
public int EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
员工客户.cs类
public List<Employee> EmployeeData { get; set; }
public Customer CustomerData { get; set; }
和我的问题:
我想获取"testForm">输入数据并发布到控制器。当我发布到控制器时,数据。员工数据计数出现,但数据列表总是空,我错过了确切的地方?
为什么我无法从控制器中的表单中获取"EmployeeId"和"FirstName"列表值并设置为员工类属性?
我会先对此进行规范化:
var resultData = {
EmployeeData: $('#testForm').serializeArray(),
CustomerData: objCustomer
};
options.data = JSON.stringify(resultData);
然后,如果您查看控制台中正在 POST 的EmployeeData
类型,您会发现它不是Employee
的列表 - 它是具有随机名称/值对的对象列表:
EmployeeData: [
0: {name: "EmployeeId", value: "1"}
1: {name: "FirstName", value: "10"}
2: {name: "EmployeeId", value: "2"}
3: {name: "FirstName", value: "100"}]
MVC不会知道这是什么,因为它是一个具有属性name
和value
的对象数组,但不是Employees
列表。 它很好地发布了这些数据,但 MVC 将无法使用它,除非对象属性的名称与模型的名称相同。 所以我认为,问题在于表单上下文中使用的命名约定。
编辑:我认为问题是您需要了解表单正在发布大量名称/值对。 以以下形式为例:
<div>
Customer 1
<input type="hidden" name="EmployeeId" value="1" />
<select name="FirstName">
<option value="100">Test 100</option>
<option value="200">Test 200</option>
<option value="300">Test 300</option>
<option value="400">Test 400</option>
<option value="500">Test 500</option>
<option value="600">Test 600</option>
</select>
</div>
<div>
Customer 2
<input type="hidden" name="EmployeeId" value="2" />
<select name="FirstName">
<option value="100">Test 100</option>
<option value="200">Test 200</option>
<option value="300">Test 300</option>
<option value="400">Test 400</option>
<option value="500">Test 500</option>
<option value="600">Test 600</option>
</select>
</div>
它将向控制器发布四件事:EmployeeID,FirstName,EmployeeId和FirstName。 这是因为整个窗体有四个名称/值对。 这些对象与 MVC 模型不对应。
就像@haim770说的那样 - 在您的示例中,问题是每次单击复选框时,都会将名称/值对发布到 MVC 控制器,但它与List<Employee>
没有任何关系。
相关文章:
- Ajax发布表单序列化,发布引号'
- 序列化数据属性中对象的最可靠方法
- YUI3 IO实用程序是否可以根据给定的内容类型标头值自动序列化数据
- 为什么JSON.stringify没有序列化原型值
- Angular.js延迟控制器初始化
- Angular JS控制器初始化错误
- 有没有一个Nodejs库可以序列化和反序列化命名组件的路径(比如URL路径名)
- 是否可以在javascript中反序列化java对象
- jQuery Ajax数组序列化错误
- 对象序列化,JAVA,Javascript
- 在jquery中以序列化的形式传递额外的paparameter
- 如何使用angularjs序列化对象
- 使用System从C#集合创建JSON数组.网状物剧本序列化
- javascript中是否有更标准化的方法来转换(序列化)非表单数据以与ajax一起使用
- 将序列化表单以及一些其他数据发送到控制器
- 序列化的 JSON 对象在控制器处显示为 Null
- Jquery 序列化 :尝试在不提交表单的情况下将表单状态传递给 ASP.NET MVC 控制器
- 数据模型在控制器中没有得到反序列化
- 将JSON反序列化到Web Api控制器中的字典中
- MVC 5 Ajax文件上传在控制器中没有反序列化