5

我需要将数组传递给 POST 方法。但我显然错过了一些我的观点看起来像这样:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %>

<input type="text" name="x[1]">
<input type="text" name="x[2]">
<input type="text" name="x[3]">
<input type="text" name="x[4]">
<input type="text" name="x[5]">
<input type="text" name="x[6]">
<input type="text" name="x[7]">

我的方法声明如下所示:

[HttpPost]
public ActionResult LetsTest(IEnumerable<Rezultat> rez)

当我尝试提取数据时,我得到的值不能为空。我错过了什么?

4

4 回答 4

6

这里有几件事是错误的:

  1. 您的视图已键入,Rezultat但您试图将模型视为IEnumerable<Rezultat>.
  2. 您正在尝试将每个文本框绑定到x[i]- 这相当于Model.x[i]- 当您真正想要将其绑定到[i].x(即Model[i].x)时。

所以,要纠正这个问题,你需要改变一些事情。

首先,将您的视图更改为继承System.Web.Mvc.ViewPage<IEnumerable<Klausimynas.Models.Rezultat>>。现在您的视图可以传递一个IEnumerable<Rezultat>,这是您的控制器操作所期望的。

其次,改变这个:

<input type="text" name="x[0]">

对此:

<input type="text" name="[0].x">

这样做的原因是第一个将尝试将值绑定到Model.x[0],它是(或者将是,一旦你正确输入了你的视图)相当于x一个实例的属性中的第一个元素IEnumerable<Rezultat>。这显然不太正确,因为 a 不IEnumerable暴露任何属性x。您想要的是绑定Model[0].x,这是index 处对象x的属性。Rezultat0

更好的是,使用帮助器为您生成名称:

for(int i=0; i < Model.Count; i++)
{
    @Html.TextBoxFor(m => m[i].x)
}
于 2013-05-11T21:37:42.900 回答
1

如果你真的想这样做,你必须使用我认为 Form Collection

[HttpPost]
public ActionResult LetsTest(FormCollection collection, IEnumerable<Rezultat> rez)
{

    string[] inputs = new string[6];
    for(int i=1; i<8; i++)
   {
       //get all your array inputs
       inputs[i-1]=collection["x["+i+"]"]
   }

}
于 2013-05-11T20:11:50.653 回答
0

在此处查看模型绑定到列表。发布的项目需要采用某种格式才能在 POST 操作中将它们作为列表检索。

于 2013-05-11T19:51:59.573 回答
0

更改您的视图代码如下:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<Klausimynas.Models.Rezultat>" %>

<input type="text" name="x[0]" />
<input type="text" name="x[1]" />
<input type="text" name="x[2]" />
<input type="text" name="x[3]" />
<input type="text" name="x[4]" />
<input type="text" name="x[5]" />
<input type="text" name="x[6]" />

更新:第二个想法,我认为这是你的实际问题,你从 1-7 开始,而不是 0-6。

谢谢蚂蚁。

于 2013-05-11T21:46:34.173 回答