0

大家好,我不知道如何做到這一點。我有兩個獨立模型的觀點,我想結合2,這樣他們都在一個視圖。梳理兩種不同模式的意見

視圖1:

@model IEnumerable<TelephoneNumberManagement.Models.Range> 

<table> 
    <tr> 
     <th> 
      RangeName 
     </th> 
     <th> 
      RangeNumber 
     </th> 
    </tr> 

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.ActionLink(item.RangeName, "ViewSubRange", new { id = item.ID }) 
     </td> 
     <td> 
      @item.RangeNumber 
     </td> 
    </tr> 
} 
</table> 

查看2: -

@model IEnumerable<TelephoneNumberManagement.Models.TestNumber> 
<h2>Index</h2> 

<table> 
    <tr> 
     <th> 
      Number 
     </th> 
     <th> 
      Status 
     </th> 
     <th> 
      Customer 
     </th> 
    </tr> 

@foreach (var item in Model) 
{ 
    <tr> 
     <td>@item.Number</td> 
     <td>@item.Status.StatusName</td> 
     <td>@item.CustomerID</td> 
    </tr> 

} 
</table> 

的HomeController: -

public ViewResult Index() 
{ 
    return View(context.Ranges.ToList().OrderBy(m => m.RangeName)); 
} 

public ActionResult ViewSubRange(int id) 
{ 
    IEnumerable<TestNumber> testNumbersList = context.TestNumbers.Where(m => m.RangeID == id).ToList(); 

    return View("SubRange", testNumbersList); 
} 

任何幫助將非常感激,因爲我敲我的頭靠在用這個牆!

+0

我使用這個任務的部分視圖。 @ Html.RenderPartial(「_ SharedViewName」)就ViewModel而言,它有點棘手。如果您將在頁面上有多個部分視圖,您可以擁有包含其他視圖模型的主視圖模型類。 – CrazyCoderz

回答

3

把你的兩個視圖放到partials中(如果你仍然需要原始視圖,那麼他們也使用partials,這樣你的視圖被定義在一個地方 - 部分)。對於你的「在一個視圖中」,添加一個新的動作和一個模型,該模型包含了部分所需的每個模型的實例。

型號:

 
public class MyBothInOneModel 
{ 
    public ModelA modelA { get; set; } 
    public ModelB modelB { get; set; } 
} 

操作:

 
public ViewResult BothInOne(int idForB) 
{ 
    MyBothInOneModel m = new MyBothInOneModel(); 
    m.modelA = context.Ranges.ToList().OrderBy(m => m.RangeName)); 
    m.modelB = context.TestNumbers.Where(m => m.RangeID == idForB).ToList(); 
} 

視圖 - 添加視圖通過調用渲染部分爲每個:

 
... 
    Html.RenderPartial(Model.modelA, "PartialA"); 
    Html.RenderPartial(Model.modelB, "PartialB"); 
... 

或者你可以使用的ViewData/ViewBag避免創建MyBothInOneModel類。

+0

大聲笑打敗我:) – CrazyCoderz

+0

我開始沒有答案!幾乎值得有一個複製和粘貼這個問題。 – Cymen

1

你有一堆選項。首先,你可以創建具有視圖模型屬性

IEnumerable<TelephoneNumberManagement.Models.TestNumber> TestNumbers

和財產

IEnumerable<TelephoneNumberManagement.Models.Range> Ranges

,然後返回一個視圖,結合新的視圖模型,並使用合併後的數據。

作爲替代方案(imho更智能的解決方案),您可以將每個視圖呈現爲子視圖@Html.Action("ActionForView1")@Html.Action("ActionForView2")

0

這是我正在談論的一個基本示例。

public class LoginRegisterMemberViewModel 
{ 
    public OpenIdLoginViewModel OpenIdLoginViewModel { get; set; } 
    public SiteLoginViewModel SiteLoginViewModel { get; set; } 
    public RegisterMemberViewModel RegisterMemberViewModel { get; set; } 
    public string ReturnUrl { get; set; } 
} 

在我登錄查看我的用戶@model Web.ViewModels.LoginRegisterMemberViewModel

的部分意見還使用@model Web.ViewModels.LoginRegisterMemberViewModel 所以,現在我有機會獲得LoginRegsiterMemberViewModel.SiteLoginViewModel.property等。

希望這不是完全脫離你想要完成的基礎。

+0

我想我需要學習剪切和粘貼更快的LOL ......兩個答案都有效。 – CrazyCoderz

1

您可以使用ViewModel模式來解決這個問題。創建一個「ViewModel」,它將給定視圖所需的所有不同模型和/或表示邏輯組合在一起。

例如:

class TelephoneViewModel 
{ 
    public IEnumerable<TelephoneNumberManagement.Models.TestNumber> { get; set;} 
    public IEnumerable<TelephoneNumberManagement.Models.Range> { get; set; } 
} 

然後讓你的新組合視圖使用它的模型的ViewModel。

0

另一種選擇是使用動態變量爲你的意見

@model IEnumerable<dynamic> 

然後,你可以給你想要的任何視圖模式,但你將需要明智什麼性質使用。

0

另外一個不錯的選擇是,如果你想獲得乾淨的分離,就是從主視圖中使用Html.RenderAction。然後實現爲所描述的每個視圖分開控制器。