【问题标题】:IEnumerable data not passing back from view to controllerIEnumerable 数据未从视图传回控制器
【发布时间】:2013-06-21 11:45:21
【问题描述】:

在我的 MVC4 项目视图中,我将 IEnumerable<Settings> 模型传递给视图。当我将表单提交回我的控制器时,控制器方法的参数为IEnumerable<Settings> data。问题是data 始终为空。

查看

@model IEnumerable<Settings>

@using (Html.BeginForm("Index", "Layout", FormMethod.Post)))
{
    @foreach (var item in Model)
    {
       @Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
       @Html.DisplayFor(modelItem => item.Name)
    }
    <input type="submit" value="Save" />
}

控制器

[HttpPost]
public ActionResult Index(IEnumerable<Settings> data)
{
    --actual code goes here
}

型号

[Serializable]
public class Settings
{   
    public virtual byte Id { get; set; }

    public virtual string Name { get; set; }

    public virtual bool IsActive { get; set; }

    public virtual DataTable DataResult { get; set; }

    public virtual int CreatedBy { get; set; }

    public virtual DateTime CreatedDate { get; set; }

    public virtual int ClientId { get; set; }

    public virtual Int16 NoofItems { get; set; }
}

更新: *渲染的 HTML*

<td>
    <input checked="checked" data-val="true" data-val-required="The IsActive field is required." id="item_IsActive" name="item.IsActive" type="checkbox" value="13" class="valid"><input name="item.IsActive" type="hidden" value="false">
                                # of pieces

                                </td>

更新1: 在 Andrei 回答后呈现 HTML

<td>
     <input checked="checked" data-val="true" data-val-required="The IsActive field is required." name="[0].IsActive" type="checkbox" value="13"><input name="[0].IsActive" type="hidden" value="false">
                                    # of pieces</td>

【问题讨论】:

  • 你的控制器方法命中了吗?
  • @BhushanFirake,是的,它成功了,从那里我只用即时窗口分析,数据为空
  • 索引操作方法的post code,你是如何从控制器返回结果的?
  • @SanjeevRai,我将通过 Collection&lt;Settings&gt; 作为视图模型...

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


【解决方案1】:
@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })

不会为输入生成正确的名称。您的表单为所有项目发送相同的令牌 item.IsActive=true(或 false)。虽然这种方法适用于基元,但它不适用于复杂类型。

但是,您可以使用 for 而不是 foreach

@model IList<Settings>

@using (Html.BeginForm())
{
    @for(int i=0; i<Model.Count; i++)
    {
       @Html.CheckBoxFor(m => m[i].IsActive, new { @value = Model[i].Id })
       @Html.DisplayFor(m => m[i].Name)
    }
    <input type="submit" value="Save" />
}

请注意,这至少需要 IList&lt;&gt; 作为视图类型 - 否则您无法使用 for 遍历集合。

【讨论】:

  • +1,您好,这部分有效,现在数据不为空,但属性IsActive 始终为falseIs 始终为。我的意思是说它都有默认属性值而不是发布的...
  • @SSS,你的模型类Settings 是什么样的?此外,现在正在为复选框生成什么 HTML?
  • @SSS,由于某种原因,您有两个输入,一个是复选框,另一个是隐藏的。它们具有相同的名称,并且都已发布(对于每个项目),显然后者,隐藏的一个,被 MVC 拾取。由于所有隐藏的值都设置为false,这就是你得到的。我不确定这个隐藏的输入来自哪里,但是您需要将其删除或给它一个不同的名称才能使复选框正常工作。
  • 感谢您的时间,我接受您的回答,我只是通过从复选框中删除值字段来修复它,我将它放在另一个隐藏字段中,现在它工作正常......
【解决方案2】:

可能需要将您的输入包装在一个表单中:

@using (Html.BeginForm()) {
   @foreach (var item in Model)
   {
      @Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id })
      @Html.DisplayFor(modelItem => item.Name)
   }
   <input type="submit" value="Save" />
}

【讨论】:

  • 我已经添加了,只是添加了部分代码。查看我的更新
【解决方案3】:

你能发布渲染的 html 吗?

这是我认为的问题: 输入(复选框)的名称将在 html 中为 IsActive。当您点击提交时,表单将使用密钥IsActive 提交数据。在您的控制器中,您当前需要一个名为 data 的参数,因此不匹配。

您可以通过在控制器中添加断点并检查 Request["IsActive"] 是否有值来解决此问题。

更新: 您可以查看here 进行演练:

我想你可以先试试把输入的name改成data。你可以尝试这样做:

@Html.CheckBoxFor(modelItem => item.IsActive, new { @value = item.Id, name="data" })

更改后,表单应向控制器提交以逗号分隔的值列表。你可以打开 firebug 并在这里发布发布到控制器的内容吗?

【讨论】:

  • 也可以将bool[] IsActive, string[] Name 作为参数
  • +1,宝贵的建议,在即时窗口检查`Request["IsActive"],值为null
  • @sTodorov 我用呈现的 HTML 更新了我的问题,你可以检查一下吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-05
  • 2020-01-06
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多