2

aspx の世界に由来する MVC を理解するのに苦労しています。

というモデルがありCustomerGarmentます。これには、いくつかの衣服OrderCustomer一緒に と があります。

public class CustomerGarment
{
    public int CustomerGarmentId { get; set; }

    public virtual Customer Customer { get; set; }

    public virtual Order Order { get; set; }

    public virtual GarmentJacket GarmentJacket { get; set; }
    public virtual GarmentShirt GarmentShirt { get; set; }
}

get と post のメソッドがあります。ページが読み込まれると、新しいCustomerGarmentインスタンスが作成され、データベースにクエリを実行して Customer 変数と Order 変数が入力されます。GarmentJacket次に、viewbag を使用してとGarmentShirtのリストを画面に表示します

ページが表示され、ビューを使用してモデルに完全にアクセスできます。ビューバッグの内容がドロップダウンにロードされ、渡したモデルを使用してすべての Customer 変数と Order 変数にアクセスできます。

次に直面する問題は、HttpPost を使用するときです。モデルは、渡した情報とともに返されません。

    public ActionResult AddGarments(int orderId, int customerId)
    {
        CustomerGarment cg = new CustomerGarment();
        cg.Order = (from a in db.Orders where a.OrderId == orderId select a).FirstOrDefault();
        cg.Customer = (from a in db.Customers where a.CustomerId == customerId select a).FirstOrDefault();

        var jackets = from a in db.GarmentJackets orderby a.Type, a.SleeveLengthInches, a.ChestSizeInches select a;
        var shirts= from a in db.GarmentKilts orderby a.PrimarySize, a.DropLength select a;
        ViewBag.GarmentJacket = new SelectList(jackets, "GarmentJacketId", "GarmentJacketId");
        ViewBag.GarmentShirt = new SelectList(shirts, "GarmentShirtId", "GarmentShirtId");

        return View(cg);
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult AddGarments(CustomerGarment cg)
    {
        // Here, I do not have the customer info for example
        db.CustomerGarments.Add(cg);
        db.SaveChanges();
        return RedirectToAction("Index");

        return View(cg);
    }

これは私の見解の一部です

@Html.HiddenFor(model => model.Order.OrderId)
    @Html.HiddenFor(model => model.Order.CustomerId)

    <div class="display-field">
        @Html.DisplayFor(model => model.Customer.Name)
    </div>


    <div class="editor-label">
        @Html.LabelFor(model => model.GarmentJacket, "Jacket")
    </div>
    <div class="editor-field">
        @Html.DropDownListFor(m => m.GarmentJacket, (SelectList)ViewBag.GarmentJacket, new {style="width:312px;height:30px;margin-top:2px;margin-bottom:5px"})
    </div>

編集

私のガーメント ジャケット モデル

public class GarmentJacket : Garment
{
    public int GarmentJacketId { get; set; }

    [Required]
    public string Type { get; set; }

    [Required]
    [Display(Name = "Chest Size")]
    public int ChestSizeInches { get; set; }

    [Required]
    [Display(Name = "Sleeve Length")]
    public int SleeveLengthInches { get; set; }
 }

public class Garment
{
    [DataType(DataType.Date)]
    public DateTime? DateRetired { get; set; }

    [Required]
    public string Barcode { get; set; }

    [Required]
    public bool Adults { get; set; }
}
4

2 に答える 2

1

私はあなたの問題を知っていると思います。上記のコメントで提案したように、ビューに保持したいものすべてを投稿する必要があります。これは、Web フォームと MVC の違いの 1 つです。Web フォームには、ビューに明示的に追加してポストバックしない情報を含むビューステートがあり、状態の印象を与えます。MVC では、それをビューに追加する必要があります。

一方、必要以上の情報を渡す必要はありません。customerId を隠しフィールドとして渡します。post メソッドでは、Id を使用してデータベースから顧客を取得し、注文を顧客に追加します。

あなたの設計についていくつか質問がありますが、顧客が Orders のコレクションを保持しているとすれば、次のようなことができます。

 [HttpPost]
[ValidateAntiForgeryToken]
public ActionResult AddGarments(CustomerGarment cg)
{

    // Get the customer from the database
    var customer = db.Customers.Find(c=>c.id==cb.Customer.Id)
    var order = new Order();
    //Create your order here using information from CustomerGarment model
    //If the model already holds a valid Order object then just add it.
    //i.e. you could get a Garment object from the DB using the GarmentId from
    //the ViewModel if you really need more than just the Id to create the order

    customer.Orders.Add(order);
    db.SaveChanges();
    return RedirectToAction("Index");

}
于 2013-10-12T14:55:05.520 に答える