【问题标题】:asp.net mvc 3 c# post array of variablesasp.net mvc 3 c#发布变量数组
【发布时间】:2023-04-10 22:26:01
【问题描述】:

我需要将数组传递给 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)

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

【问题讨论】:

  • 您想将这些字段绑定到rez 的哪个属性?您不能将文本框值绑定到复杂类型。除非您的财产是 rez.x,否则这将不起作用。
  • 到 int,但我把它改成字符串我得到相同的结果
  • 但是您要绑定的Rezultat 对象的属性是什么?
  • 这是属性: public string x { get;放; }
  • 好的,我想我明白你需要什么了。请看我的回答。

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

这里有几个问题:

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

因此,要纠正此问题,您需要更改一些内容。

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

其次,改变这个:

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

到这里:

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

这样做的原因是第一个将尝试将值绑定到Model.x[0],这(或将在您正确键入视图后)等效于属性x 中的第一个元素IEnumerable&lt;Rezultat&gt; 的实例。这显然不太正确,因为IEnumerable 没有公开属性x。你想要的是绑定Model[0].x,这是Rezultat对象在索引0处的属性x

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

for(int i=0; i < Model.Count; i++)
{
    @Html.TextBoxFor(m => m[i].x)
}

【讨论】:

    【解决方案2】:

    如果你真的想这样做,我认为你必须使用表单集合

    [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+"]"]
       }
    
    }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        如下改变你的视图代码:

        <%@ 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 开始。

        感谢蚂蚁。

        【讨论】:

        • 您预计Rezultat 的实例有一个名为rez 的可索引属性?我认为这需要重新考虑。
        • Ant... 我认为所有的问题都是索引。 DefaultModelBinder 将尝试将输入值与类型的属性匹配,在这种情况下为Rezultat,但它对指定的索引非常敏感。它们必须从 0 开始,并且必须是连续的。
        • 我不同意这就是问题所在。您的解决方案暗示他正试图通过Rezultat.x[0] 传递Rezultat.x[n-1],当仔细阅读问题时,很明显 - 作为我的回答细节 - 他实际上想通过Model[0].x 传递Model[n-1].x,其中@987654329 @ 是 IEnumerable&lt;Rezultat&gt;
        猜你喜欢
        • 1970-01-01
        • 2011-08-21
        • 1970-01-01
        • 1970-01-01
        • 2011-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多