【问题标题】:asp.net razor Model Binding Dynamic List in Form submission表单提交中的asp.net razor模型绑定动态列表
【发布时间】:2013-02-22 17:35:03
【问题描述】:

我正在尝试为输入创建一个订单表单。

我需要用户能够添加多个订单项然后更新。我试图 使用购物车类(用户创建一个购物车项目并添加一个 列表项,可以在列表项中添加多行)。

我没有解决这个问题。我正在使用 asp.net razor 正在使用 webmatrix 建立网站。 Webmatrix 说它无法识别 Cart()。

@{ 
if (Session["cart"] == null)
{
Session["cart"] = new Cart();
}
Cart cart = (Cart)Session["cart"];

}
<table id="cartTable">
<tr>
<th class="product">Product</th>
<th class="size">Size</th>
<th class="price">Price</th>
</tr>
@foreach (var item in cart.Items)
{
<tr>
<td class="product">@item.ProductID</td>
<td class="size">@item.Size</td>
<td class="price">£@item.Price</td>
</tr>
}
</table>

有没有更好的方法来做到这一点?非常感谢所有帮助

【问题讨论】:

    标签: asp.net asp.net-mvc asp.net-mvc-3 razor webmatrix


    【解决方案1】:

    有一种方法可以绑定动态列表元素

    @foreach (i=0; i< cart.Items.count; i++)
    {
    <tr>
       <td class="product"> <input type="hidden" name="cart.item[@i].ProductID"> </td>
       <td class="size"> <input type="text" name="cart.item[@i].Size"> </td>
       <td class="price">£ <input type="text" name="cart.item[@i].Price"> </td>
    </tr>
    }
    

    Webmatrix is saying that it doesnt recognise Cart()
    

    我强烈建议您将模型放在 Models 文件夹中,并使它们成为 Models 命名空间的一部分。然后它们应该自动可用。否则,您可能必须通过它的完整参考路径来引用购物车(如果它不在您的模型文件夹中)。例子

    Datalayer.Entities.Cart cart = (Datalayer.Entities.Cart)Session["cart"];
    

    最后说明: 您没有将购物车作为模型传递给您的视图

    例子

    @model {Project}.Entities.Cart
    

    这是使用 MVC 3 框架的更好做法。您会更早发现任何参考问题,并且可以选择使用紧密绑定的 Helpers

    【讨论】:

    • +1 好答案。模型绑定到列表是 asp.net mvc 中最大的“陷阱”之一
    • 感谢您的回复。 cart 是 app_data 文件夹中的一个 c 格式文件,我的印象是它适用于我网站中的所有页面。
    • @OmalieBraithwaite 也许是。调试的第一步是使用命名空间来引用。
    【解决方案2】:

    我建议使用 Visual Studio 2012 Express over WebMatrix 进行 MVC 开发。此外,如果您希望让用户通过同一页面即时添加订单项,我还建议您使用 jQuery (javascript)。如果您愿意,我可以与您分享一个示例。

    另一个注意事项:您使用 MVC 和 WebForms 标记了这个,它们是两个非常不同的平台。

    编辑:

    我认为 Dave A 的解决方案可能更好,但要使用 jQuery 来做到这一点:

    1 将您的添加按钮和隐藏div 放在一个表单中

    <form action="/MyController/MyAction" method="post" id="addListItemForm">
    <button id="addListItemButton">Add List Item</button>
    <div style="hidden">
    <input type="text" name="product" id="product" />
    <button id="addButton">Add</button>
    </div>
    <input type="submit" text="Submit" />
    </form>
    

    2 在按钮单击时显示表单字段

    $('#addListItemButton').click(function(){
      $('#addListItemForm div').show();
    });
    

    3 在添加按钮单击时添加隐藏字段

    $('#addButton').click(function(){
      var product = $('#addListItemForm #product').val();
      $("input").attr({
                name : "productListItems[]", 
                type : "hidden",
                value : product
            }).after('#addListItemForm');
    });
    

    4 当表单提交时,您将在productListItems数组中通过POST方法传递各种产品名称。

    注意:您将不得不稍微玩一下,但这将是一个很好的学习练习...我不确定您要做什么,但这是我的最佳猜测。

    【讨论】:

    • 我对 tag.now learning.an 示例的错误将不胜感激。非常感谢。
    • 这里是一个使用隐藏字段通过 jQuery 向表单添加项目的方法示例。
    • 我的问题可能听起来很轻率,但我可以将 jquery 与 webmatrix 一起使用吗?我认为这是剃须刀,c 锐利。只是在询问。我正在尝试构建一个订单表单页面。它允许用户添加超过一件到他们的订单然后发布。订单号名称等只输入一次。因为现在我可以添加一个项目并在 gridview 中查看。感谢您的代码..
    • 是的,jQuery 是一种客户端语言,独立于服务器(可以与 C#、VB、PHP 等一起使用)。我不知道你到底想做什么,但你可以试试我给你的,看看它是否能达到你想要的效果。
    猜你喜欢
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多