2016-09-26 133 views
1

我有以下視圖模型,其中包括其他2種型號:ASP.NET MVC:如何在一個視圖中使用多個模型?

public class ViewModel 
{ 
    public ViewModel1 viewModel1 { get; set; } 
    public ViewModel2 viewModel2 { get; set; } 
} 

我的視圖看起來是這樣的:

@Html.TextBoxFor(m => m.viewModel1.NameOfCustomer) 
@Html.TextBoxFor(m => m.viewModel2.ProductCategory) 

最後控制器:

public ActionResult CreateNewOrder(ViewModel viewModel) 
{ 

    Model1 myModel1 = new Model1() 
    { 
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

    return View(viewModel); 
} 

的問題是,如果我想從我的ViewModel中獲取數據,將它傳遞給我的實際模型,但它不起作用。它只顯示爲空值。如果我做了如下修改我的控制器的數據是存在的,但是,這並不工作,因爲它應該:

public ActionResult CreateNewOrder(ViewModel viewModel) 
{ 
    // that works 
    viewModel.viewModel1.NameOfCustomer = "John John"; 

    Model1 myModel1 = new Model1() 
    { 
    myModel1.NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

    return View(viewModel); 
} 

所以我想這個問題是,從我的觀點我的數據沒有被正確地發送到我的視圖模型。我希望你們能給我一個暗示我做錯了什麼。

問候,

+0

當你說「它只顯示爲空值。」指定什麼顯示空? viewModel爲null或模型本身的屬性爲null? –

+0

您可以將不同的ViewModel數據發佈到不同的操作。像'ViewModel1'數據到某個動作'/ vm1'和'ViewModel2'動作'/ vm2' –

+0

你可以使用元組來發送多個模型到一個視圖 – Bharat

回答

0

編輯以下@Stephen Muecke的評論,聽起來不像是這種情況。不過,我會在這裏留下這個答案,因爲我的第一個通話端口仍然是檢查請求中的POST有效負載,以確保它按預期通過導線,所以此部分可能有用


看起來好像是因爲進入MVC動作的數據本質上是一個扁平視圖模型,而動作中預期的模型是分層的。

如果查看瀏覽器開發工具中的網絡選項卡,找到正在發出的POST請求,並檢查發送到服務器的有效負載。

聽起來這是正在發佈:
{"NameOfCustomer": "SomePerson", ....}

,不會被自動綁定服務器端的模式,因爲ViewModel本身並不具有NameOfCustomer屬性 - 相反,它是在舉行一個子對象上viewModel1屬性。因此,自動綁定會工作,如果下面是被張貼:
{"viewModel1": {"NameOfCustomer" : "SomePerson", ....}}

解決方案包括:
1)構建的有效載荷從JS自己張貼,確保結構正確如上
2反映了嵌套對象)創建扁平視圖模型,所以從ViewModel1所有屬性都直接在頂層的ViewModel
3)召開創建自定義的模型綁定

+2

'@ Html.TextBoxFor(m => m.viewModel1.NameOfCustomer)'用'name =「viewModel1.NameOfCustomer」'生成一個輸入,該輸入將正確綁定 –

+1

@StephenMuecke - 謝謝,看起來像是模型正在發生的奇怪事情在那個領域有約束力,但也許不是! – AdaTheDev

0

您的代碼應切實履行信息到控制器(看到類似的小提琴here

這件作品:

Model1 myModel1 = new Model1() 
    { 
    NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
    }; 

    db.Orders.Add(myModel1); 
    db.SaveChanges(); 

你確定你在這裏做正確的事情?您正在創建一個Model1類型變量,並將其添加到數據庫中的Orders。你有什麼錯誤嗎?也許正確的代碼應該是這樣的:

 Order myModel1 = new Order() 
     { 
     NameOfCustomer = viewModel.viewModel1.NameOfCustomer 
     }; 

     db.Orders.Add(myModel1); 
     db.SaveChanges(); 
+0

如果我理解正確,錯誤是MVC沒有綁定到操作參數,而不是數據庫保存的內容。 –

+0

Model1可能不是命名它的最佳方式,您是對的。但它是正確的模式。我會回答你的問題,如果我回到家裏,直到現在,我要感謝大家在這裏的努力,我非常感謝你的反饋! :) – RawMVC

+0

我只是不得不問/假設,因爲在小提琴鏈接一切似乎都與綁定工作正常。 RawMVC也聲明瞭這樣的話:「如果我對控制器數據做了以下更改,但是這不起作用」,這些話讓我相信數據仍然不會保存到數據庫中。 – avi

相關問題