我的模型应该如何通过动态添加的文本框将数据存储在数据库中?

时间:2012-08-10 15:21:34

标签: asp.net-mvc-3 entity-framework-4

我的模特:

public class Order
{
     public int OrderId { get; set; }
     public int Quantity { get; set; }
     public double Width { get; set; }
     public double Height { get; set; }
}

在我对该模型的强类型视图中,我有一个TextBoxFor的表单,用于以下属性:

<table>
    <tr>
        <td><a href="#" onclick="AddTextBox()">+</a></td>
        <td>@Html.TextBoxFor(m => m.Quantity)</td>
        <td>@Html.TextBoxFor(m => m.Width)</td>
        <td>@Html.TextBoxFor(m => m.Height)</td>
    </tr>
</table>

AddTextBox()的链接是一个jQuery函数,用于动态添加另一个包含三个以上文本框的表。

我的控制器:

[HttpPost]
public ActionResult SaveOrder(Order order)
{
    context.Order.Add(order);
    context.SaveChanges();
    return View();
}

调试时我可以看到订单对象填充了表单中的数据但只有第一个数量,重量和高度文本框的值,我知道这是预期的行为,我知道我收到的所有值都是因为我测试了下面的例子,我的列表填写正确:

[HttpPost]
public ActionResult SaveOrder(List<int> Quantity, List<int> Width, List<int> Height)
{
    return View();
}

所以这里又是一个问题:我应该如何创建一个模型来保存该数据数据并保存在我的数据库中?

我希望我对这个问题很清楚,并感谢你的回答。

2 个答案:

答案 0 :(得分:0)

您的视图模型必须包含您要添加的列表。您无法将模型添加到单个人的固定实例(@model在您的视图中)。所以你的模型必须是可扩展的。

以下是您的示例Editing a variable length list, ASP.NET MVC

了解他们已完成的工作,并为您的控制和查看做同样的事情。我完全基于这篇文章构建了我的应用程序 - 它很简单,甚至可以理解新手(具有基本知识)并在你的领域内实现类似的功能。 他们还有完整的演示源代码,您可以下载并使用

用简单的话来描述这个过程太长了

  1. 在您的控制器中创建专用操作并使用ajax调用它来生成您想要添加到视图中的任何内容(在您的情况下为textbox,但它肯定会更复杂)并且

  2. $(<your selector>).append(<your result from ajax call>)

  3. 在回复到控制器后,您会看到列表中包含您在视图中添加/删除的实际项目数

  4. 您一个接一个地将它们添加到您的DTO并在完成后提交交易。

  5. 希望这有帮助。

答案 1 :(得分:0)

终于!

我不知道我是否对我的问题非常清楚,但这是我找到的解决方案,我不知道这是否非常简单,因为我对编程不是很有经验,所以感谢谁我试图帮助我。

除了只有一个模型我必须创建另一个模型以保存我的数据库所有的每个订单所有的度量,所以我改变了我的模型看起来像这样:

public class Order
{
     public int OrderId { get; set; }
     public virtual List<Measures> Measures { get; set;}
     // I have many other properties here but i erased for simplicity...
}

public class Measures
{
     public int MeasuresId { get; set; }
     public int Quantity { get; set; }
     public double Width { get; set; }
     public double Height { get; set; }
     public Order Order { get; set; }
}

所以在我添加一些<input> dinamically之后,我的所有名称属性都是数量,宽度或高度,我在控制器上收到的响应是这样的:

Quantity: 10
Width: 20
Height: 16
Quantity: 3
Width: 14
Height: 10
Quantity: 500
Width: 2
Height: 5

最后,我的控制器是:

    [HttpPost]
    public ActionResult SaveOrder(Order Order, List<int> Quantity, List<double> Width, List<double> Height)
    {
        List<Measures> Measures = new List<Measures>();

        //At this point my Order model is filled with all the properties
        //that came from the form and I'll save it to the Database so that
        //this model can have its Id filled from the identity column
        unitOfWork.ServicosRepository.Insert(Order);
        unitOfWork.Save();

        //Now that I have the OrderId I can add how much Measures I want referencing
        //that OrderId to access that further on my View
        for (int i = 0; i < Quantity.Count; i++)
        {
            Measures measures = new Measures { Quantity = Quantity[i], Width = Width[i], Height = Height[i], Order = Order };
            unitOfWork.MedidasRepository.Inserir(medidas);
            unitOfWork.Salva();
            Medidas.Add(medidas);
        }

        return PartialView("_Emitir", Pedido);
    }