0

データベースからエンティティデータモデルを作成しました。ただし、アプリケーションの特定の領域では、2つのモデルを渡す必要があります。したがって、必要な各モデルのオブジェクトをプロパティとして持つ3番目のモデルを作成します。

シナリオでは、1つのモデルを使用して一部のデータをユーザーに表示し、もう1つのモデルをユーザーがフォーム要素を使用して入力します。したがって、カスタムモデルにコンストラクターを作成してデータを設定します。コードは次のとおりです。

カスタムモデル

public class ordersModel
{
    public ordersModel(order or)
    {
        this.prods = new order_products();
        this.new_order = new order();
        this.new_order.customer_id = or.customer_id;
        this.new_order.my_id = or.my_id;
        this.new_order.my_order_id = or.my_order_id;
        this.new_order.order_date = or.order_date;
        this.new_order.order_status_id = or.order_status_id;
    }
    public order new_order { get; set; }
    public order_products prods { get; set; }
}

コントローラーでは次のように使用されます。

public ActionResult Create()
    {
        order or = new order();
        // Store logged-in user's company id in Session
        //or.my_id = Session["my_id"].ToString();
        //do something to allow user to select customer, maybe use ajax
        or.customer_id = "123";
        or.order_amount = 0;
        or.my_id = "74973f59-1f6c-4f4c-b013-809fa607cad5";
        // display date picker to select date
        or.order_date = DateTime.Now.Date;
        // fetch statuses from database and show in select list box
        or.order_status_id = 1;
        return View(or);
    } 

    //
    // POST: /Orders/Create

    [HttpPost]
    public ActionResult Create(order or)
    {
        using (invoicrEntities db = new invoicrEntities())
        {
            var temp = db.last_order_number.SingleOrDefault(p => p.my_id == or.my_id);
            if (temp != null)
            {
                or.my_order_id = temp.my_order_id + 1;
                if (ModelState.IsValid)
                {
                    ordersModel ord = new ordersModel(or);

                    db.orders.AddObject(or);
                    temp.my_order_id = temp.my_order_id + 1;
                    //TempData["my_order_id"] = or.my_order_id;
                    db.SaveChanges();
                    return RedirectToAction("AddProducts", ord);
                    //return RedirectToAction("AddProducts", new { id = or.my_order_id });
                }
                return View(or);
            }
            return RedirectToAction("someErrorPageDueToCreateOrder");
        }
    }

    public ActionResult AddProducts()
    {
        using (invoicrEntities db = new invoicrEntities())
        {
            //string my_id = TempData["my_id"].ToString();
            //string my_order_id = TempData["my_order_id"].ToString();

            string my_id = "74973f59-1f6c-4f4c-b013-809fa607cad5";
            int my_order_id = 1;
            //Int64 my_order_id = Convert.ToInt64(RouteData.Values["order_id"]);

            // Display this list in the view
            var prods = db.order_products.Where(p => p.my_id == my_id).Where(p => p.my_order_id == my_order_id).ToList();

            var or = db.orders.Where(p => p.my_id == my_id).Where(p => p.my_order_id == my_order_id).ToList();
            if (or.Count == 1)
            {
                //ViewData["name"] = "sameer";
                ViewData["products_in_list"] = prods;
                ViewData["order"] = or[0];
                return View();
            }
            return RedirectToAction("someErrorPageDueToAddProducts");
        }
    }

    [HttpPost]
    public ActionResult AddProducts(order_products prod)
    {
        prod.my_id = "74973f59-1f6c-4f4c-b013-809fa607cad5";
        // find a way to get the my_order_id
        prod.my_order_id = 1;
        return View();
    }

「ADDPRODUCTS」ビューまで、これはすべてうまくいきます。

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<invoicr.Models.ordersModel>" %>

AddProducts

<h2>AddProducts</h2>
<%: Model.new_order.my_id %>

上記のステートメントはエラーになります

例外の詳細:System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。

私はここで何が間違っているのですか?

4

1 に答える 1

0

ビューを再表示するときに、間違ったモデルを渡しているようですCreate

タイプがあり、ビューが強くタイプされているordインスタンスを渡してみてください。ordersModel

public ActionResult Create(order or)
{
    using (invoicrEntities db = new invoicrEntities())
    {
        var temp = db.last_order_number.SingleOrDefault(p => p.my_id == or.my_id);
        if (temp != null)
        {
            or.my_order_id = temp.my_order_id + 1;
            ordersModel ord = new ordersModel(or);
            if (ModelState.IsValid)
            {
                db.orders.AddObject(or);
                temp.my_order_id = temp.my_order_id + 1;
                db.SaveChanges();
                return RedirectToAction("AddProducts", ord);
            }
            return View(ord);
        }
        return RedirectToAction("someErrorPageDueToCreateOrder");
    }
}

アップデート:

アクションを示したので、ビューはインスタンスAddProductsを想定していますが、モデルをビューに渡していません。ordersModelだからだけではありませんreturn View();。次のインスタンスを渡す必要がありますordersModel

if (or.Count == 1)
{
    ViewData["products_in_list"] = prods;
    ViewData["order"] = or[0];
    ordersModel ord = new ordersModel(or[0]);
    return View(ord);
}
于 2012-05-01T16:57:19.037 に答える