【问题标题】:Empty List When Data Is Posted To Action Method (ASP .Net MVC)数据发布到操作方法时的空列表(ASP .Net MVC)
【发布时间】:2011-02-22 06:17:23
【问题描述】:

我在向 Post 方法提交数据时遇到问题。

我有一个类似的课程:

public class A
{
  public int Id{get; set;}
  public string Name{get; set;}
  public List<B> Bs {get; set;}
}

在视图中,我有一个 Bs 对象列表,我可以毫无问题地将其添加到 A 类的 Bs 属性中。我也可以在 Razor View 中毫无问题地看到结果。

当我将最终结果发布到我的 Add Action Method 以将它们保存在我的数据库中时,就会出现问题。

当最终对象发送到我的 Action 方法时,Bs 属性完全为空。所以我所做的就是将该集合添加到 TempData 字典并在我的 Add Action 方法中检索它。

我的问题很简单,为什么我的 Bs 属性在发布到我的 Edit 操作方法时是空的?我之所以问这个问题是因为在我的 AddBs 操作方法中,我将我的 Bs 添加到我的模型中并将其发送回 View 并且到目前为止一切都找到了。

编辑: @SLaks

这是我的视图中的代码:

            <div class="editor-label">
                <%: Html.LabelFor(model => model.Name) %>
            </div>
            <div class="editor-field">
                <%: Html.EditorFor(model => model.Name) %>
                <%: Html.ValidationMessageFor(model => model.Name) %>
            </div>

            <% if (Model.Bs.Any())
               { %>
                    <h3>B List</h3>
                    <%= Html.Telerik().Grid(Model.Bs)
                    .Name("CheckedOrders")
                    .Columns(columns =>
                    {
                        columns.Bound(d => d.Id).Width(100);
                        columns.Bound(d => d.Name).Width(300);
                    })
                    .Footer(false)
                    %>
             <% } %>

            <br />

            <p>
                <input type="submit" value="Create" />
            </p>
        </fieldset>
    <% } %>

This is the HTML generated:

<form action="/Admin/BusinessType/Create" method="post">
    <fieldset>

        <div class="editor-label">
            <label for="Name">Name</label>
        </div>
        <div class="editor-field">
            <input class="text-box single-line" id="Name" name="Name" type="text" value="" />

            <span class="field-validation-valid" data-valmsg-for="Name" data-valmsg-replace="true"></span>

        </div>                 
                <div class="t-widget t-grid" id="CheckedOrders"><table cellspacing="0"><colgroup><col style="width:100px" /><col style="width:300px" /></colgroup><thead class="t-grid-header"><tr><th class="t-header" scope="col">Id</th><th class="t-last-header t-header" scope="col">Name</th></tr></thead><tbody><tr><td>2</td><td class="t-last">Heeey</td></tr><tr class="t-alt"><td>3</td><td class="t-last">Testtttt</td></tr></tbody></table></div>

        <br />
        <p>
            <input type="submit" value="Create" />
        </p>
    </fieldset>
</form>

上面的代码在我的浏览器中显示得非常好,我什至可以看到 Bs 列表,但是当我输入名称并单击 Create 时,Bs 列表是空的。

【问题讨论】:

  • 它给 Grid 产生的控件起什么名字?
  • @Rob 我已将生成的 HTML 添加到问题中。
  • 查看 HTML 似乎没有为 Bs 元素生成任何表单控件(因此没有一个可以回发)。您可以通过查看操作方法中的 Request.Form 和 Request.QueryString 来判断是否有可能使用这些值。
  • 是否可以将集合添加到隐藏表单中?

标签: asp.net-mvc


【解决方案1】:

我认为这其中的秘密在于视图。我的应用程序中有一个类似的模型。在视图中,您必须正确格式化控件的名称:

<%
for (int i=0; i<model.Bs.Count; i++)
{
  Html.TextBox( string.Format( "Bs[{0}].Property1OfB", i), model.Bs.Property1OfB );
  Html.TextBox( string.Format( "Bs[{0}].Property2OfB", i), model.Bs.Property2OfB );
}
%>

【讨论】:

  • 这不是很漂亮,我正在使用 Telerik 辅助方法,所以我希望 Telerik 能够正确处理命名。
  • 当然不是(但它确实对我有用)。还要记住,Bs 类需要对其属性进行获取/设置。
【解决方案2】:

Add 方法将只接收发布到它的表单中的任何 &lt;input&gt; 元素。

【讨论】:

  • View 中显示的 B 列表都在 元素内!但是我仍然得到空的 Bs。
  • 还有一件事,我在输入标签之间使用了 Telerik Grid:demos.telerik.com/aspnet-mvc 这可能会导致任何问题吗?
  • 好的,我回家后会向您展示我的观点。我现在在上班。
猜你喜欢
  • 2013-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2011-10-13
  • 1970-01-01
相关资源
最近更新 更多