1

私はMVCが初めてです。ビューからコントローラーにデータを渡すのに問題があります。

このアプリケーションは、シャツを注文するためのものです。Tシャツ、カジュアルシャツ、フォーマルシャツなど、さまざまなタイプがあります。1回の注文で、Tシャツ2枚、カジュアルシャツ3枚、フォーマルシャツ5枚を注文したいです。単一の値、つまりいずれかを 1 つの順序で編集できます。私が直面している問題は、1 回の注文で複数の種類のシャツを注文することです。

public class Shirt    
{
   //[Key]
   public int ShirtId{ get; set; }
   public string ShirtName{ get; set; } // This is an read-only field    
}

public class Order
{
    public int ShirtId { get; set; }
    public virtual Shirt Shirt { get; set; } // a reference to Shirt
    public int Quantity { get; set; } 
    public int OrderId { get; set; }
}

ビューモデル「注文」で強く型付けされたビューがあります。最初に、コントローラーからビューにデータを渡しました

     [HttpGet]
    public ActionResult Index()
    {
       OrdersList();
       return View(db.Order.ToList());
    }

ここで OrdersList は、データベースとやり取りして Orders のリストを取得する関数です。

   void OrdersList()
   {
     ViewBag.OrdersLsit= from f in db.Shirt
                            orderby f.ShirtName
                            select f;
   }

を使用してコントローラーにデータを戻しています。

    [HttpPost]
    public ActionResult Index(List<Order> order)
    {
        Order newOrder = new Order();
        for (int i = 0; i < order.Count; i++)
        {
            newOrder.Quantity = order.ElementAt(i).Quantity;
            if (ModelState.IsValid)
            {
                db.Entry(newOrder).State = EntityState.Modified;

                db.SaveChanges();
            }
        }
    }

私の問題は、リストの順序が Null として渡されることです。HttpPost
で public ActionResult Index(Order order) を実行すると、最初のアイテムのみが取得されます (この場合、データベースで T シャツが更新されます)。

Index.cshtml では、このようなことをしています

  <legend>Order Shirts</legend>
         <table>
            <tr>
                @{List<Order> orderList = new List<Order>(); }
                @foreach (Order ord in ViewBag.OrderList)
                {
                    <td>
                    @Html.DisplayFor(model => ord.Shirt.Shirtname)
                    </td>
                    orderList.Add(ord);
                }
            </tr>

            <tr>
                @for (int i = 0; i < orderList.Count; i++)
                {
                    <td class = "editorClass">
                            @Html.HiddenFor(model => orderList.ElementAt(i).Shirt.ShirtId)
                            @Html.HiddenFor(model => orderList.ElementAt(i).OrderId)
                            @Html.ValidationSummary(true)
 @Html.HiddenFor(model => orderList.ElementAt(i).ShirtId)                                
                            @Html.EditorFor(model => orderList.ElementAt(i).Quantity)
                            @Html.ValidationMessageFor(model => orderList.ElementAt(i).Quantity)
                    </td>
                }
            </tr>
        </table>
    </fieldset>
   <p>
       <input id = "btnSubmit" type="submit" value="Save Order" /> 
    </p>
    <div>
        @Html.ActionLink("Back to List", "Index")
    </div>

私は MVC を初めて使用し、これが私の最初のアプリケーションです。建設的なコメントや提案を歓迎します。ありがとう

4

1 に答える 1

0

代わりにビューを作成している理由がわかりませんorderList。実際には、コントローラーからそれを渡し、ビューを に強く入力する必要がありますList<Order>

これを使う代わりに、

@Html.EditorFor(model => orderList.ElementAt(i).Quantity)

試すことができます(ビューを強く入力した場合List<Order>)、

@Html.EditorFor(m => m[i].Quantity)

ビューが強く型付けされていない場合は、List<Order>これを試すことができます。

@Html.EditorFor(m => orderList[i].Quantity)

ただし、この場合、次のようにアクションを変更する必要があります。

[HttpPost]
public ActionResult Index([Bind(Prefix="orderList")]List<Order> order)
{
}

ElementAt(i)その理由は、フィールドの名前が適切に生成されるかどうかわからないため、インデックス アプローチを試してください!

于 2012-07-16T14:09:52.753 に答える