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);
}
}
Customer.cs类
public int CustomerId { get; set; }
public string CompanyName { get; set; }
Employee.cs Class
public int EmployeeId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
EmployeeCustomer.cs Class
public List<Employee> EmployeeData { get; set; }
public Customer CustomerData { get; set; }
和我的问题:
我希望&#34; testForm&#34; 输入数据并发布到控制器。当我发布到控制器时, data.EmployeeData计数出现但数据列表始终为null 我完全错过的地方?
为什么我不能得到&#34; EmployeeId&#34;和&#34; FirstName&#34;从Controller中的表单列出值并设置为Employee类属性?
答案 0 :(得分:0)
我会先将这一点归一化:
var resultData = {
EmployeeData: $('#testForm').serializeArray(),
CustomerData: objCustomer
};
options.data = JSON.stringify(resultData);
然后,如果你看一下在控制台中发布了什么类型的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>
没有任何关系