3

私のモデル:

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()3 つ以上のテキスト ボックスを含むような別のテーブルを動的に追加する 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();
}

ここでまた質問です。データの配列を保持し、データベースに保存するモデルをどのように作成すればよいでしょうか?

質問が明確だったことを願っています。あなたの答えに感謝します。

4

2 に答える 2

0

ついに !

私の質問が非常に明確であったかどうかはわかりませんが、これが私が見つけた解決策です。プログラミングの経験があまりないため、それが非常に単純かどうかはわかりません。自分。

モデルを1つだけ持つのではなく、すべての注文に含まれるすべてのメジャーをデータベースに保持するために別のモデルを作成する必要があったため、モデルを次のように変更しました。

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>それらの名前属性はすべて、Quantity、Width、またはHeightであり、コントローラーで受け取った応答は次のようになりました。

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);
    }
于 2012-08-10T22:28:29.173 に答える
0

ビュー モデルには、追加するリストが必要です。シングルトーンの固定インスタンス (@modelビュー内にある) にモデルを追加することはできません。SO モデルは拡張可能でなければなりません。

これがあなたのサンプルです、可変長リストの編集、ASP.NET MVC

彼らが何をしたかを見て、あなたのコントロールとビューに対して同じことをしてください。この記事に完全に基づいてアプリを作成しました。初心者でも (基本的な知識があれば) 理解し、領域内で同様の機能を実装できるほどシンプルです。また、ダウンロードして再生できる完全なデモ ソース コードもあります。

プロセスを説明するには長すぎます。簡単な言葉で言えば、

  1. コントローラーで専用のアクションを作成し、ajax を使用してそれを呼び出して、ビューに追加したいものを生成します (textboxこの場合、確かにもっと複雑なものになる可能性があります)。

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

  3. コントローラーにポストバックすると、ビューで追加/削除したアイテムの実際の数を含むリストが表示されます

  4. それらを 1 つずつ DTO に追加し、完了したらトランザクションをコミットします。

お役に立てれば。

于 2012-08-10T16:17:03.107 に答える