将表单发布到控制器

时间:2014-12-16 13:57:24

标签: javascript c# jquery asp.net-mvc

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类属性?

1 个答案:

答案 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不会知道它是什么,因为它是具有属性namevalue的对象数组,而不是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>没有任何关系