无法从MVC控制器读取提交的表单数据

时间:2017-01-06 09:59:12

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

我有以下表单,其中包含我要发送到服务器的多维数组中的数据。问题是我无法在我的控制器中选择这些数据。

的index.html

<form id="my-form" action="/Home/TestingMethod" method="post">
    <table id="people" class="table table-striped">
        <thead>
            <tr>
                <th>ID</th>
                <th>Name</th>
                <th>Owns Item</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>1</td>
                <td>Danny</td>
                <td class="items">
                    <select name="PersonList[1]Item[]" class="form-control">
                        <option value=""></option>
                        <option value="Keys">Keys</option>
                        <option value="Phone">Phone</option>
                    </select>
                </td>
            </tr>
        </tbody>
    </table>
</form>

为MyModel

public class MyModel
{
    public List<int> PersonList { get; set; }
}

的HomeController

[HttpPost]
public JsonResult TestingMethod(MyModel model)
{
    List<int> list_of_people = model.PersonList;
    return Json("I am the server, I got your data.");
}

问题是list_of_people包含0个元素。

提交表单数据

PersonList[1]Item[]:Phone

相关:how to access Javascript multidimensional array in MVC controller

1 个答案:

答案 0 :(得分:2)

您的选择字段的命名约定不正确。为了匹配您的模型结构,它应该如下所示:

PersonList

因为<option value="0">Keys</option> <option value="1">Phone</option> ... 属性只是一个整数数组。如果您希望能够绑定到整数,还要确保发送整数值:

public class MyModel
{
    public List<int?> PersonList { get; set; }
}

如果你想允许空值,请确保你的列表被定义为可以为空的整数:

<option value=""></option>
<option value="0">Keys</option>
<option value="1">Phone</option>
...

现在你可以这样做:

public class MyModel
{
    public List<Person> PersonList { get; set; }
}

如果另一方面它是一个复杂的属性:

public class Person
{
    public List<Item> Items { get; set; }
}

其中Person的定义如下:

<select name="PersonList[0].Items[0].SomeProperty" class="form-control">
<select name="PersonList[0].Items[1].SomeProperty" class="form-control">
<select name="PersonList[1].Items[0].SomeProperty" class="form-control">
...

然后你可以这样做:

>>> x = np.arange(1, 10).reshape((3, 3))
>>> x
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
>>> i = np.array([0, 1, 2, 5, 8, 7, 6, 3])  # Indices in circular order
>>> x.flat[i]
array([1, 2, 3, 6, 9, 8, 7, 4])

我还建议您浏览following post,它解释了模型绑定器的工作原理以及它所期望的命名约定。