2012-05-01 8 views
0

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

このシナリオでは、あるモデルをユーザーに表示するだけのモデルを使用し、もう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(); 
    } 

THIS ALLは "ADDPRODUCTS" ビューでUNTIL、WELL OUT WORKS:

<%@ 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:オブジェクトのインスタンスに設定されていないオブジェクト参照を。

私はここで間違っていますか?

答えて

0

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

タイプordersModelであり、あなたのビューが強くに型付けされたものであるordインスタンスを渡して試してみてください。

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"); 
    } 
} 

UPDATE:あなたの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); 
} 
+0

** **アクションメソッドが**オーダー**モデルにバインドされて作成します。とにかく、そのコードにまだ達していないので、そうではない。この問題は** addproducts **ビューで発生し、値を取得できません。 もう1つのこと、私はコード内で言及するのを忘れていました**ここに投稿した**作成**アクションメソッドは** HTTPPost ** –

+0

です。作成ビューはどうですか?あなたが '<%:Model.new_order.my_id%>'コールを使用したものは?また、あなたはいくつかの 'AddProducts'ビューについて言及したようですが、それを表示しているビューもコントローラアクションも表示していません。だから助けが難しい。 –

+0

Createビューはオーダー・モデルにバインドされています addproductsビューはordersModelモデルにバインドされています。 私が使った命名は、それを理解するのが難しいと思う。 –

関連する問題