将两个视图与不同模型组合在一起

时间:2011-08-31 14:33:59

标签: asp.net asp.net-mvc asp.net-mvc-3 c#-4.0 entity-framework-4

大家好,我不知道怎么做。我有2个独立模型的两个视图,我想结合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);
}

任何帮助都会非常感激,因为我正用这个撞击墙壁!

6 个答案:

答案 0 :(得分:3)

获取两个视图并将它们放入部分视图中(如果您仍然需要原始视图,则它们也使用部分视图,以便您的视图在一个位置定义 - 部分视图)。对于“在一个视图中”,添加一个新操作和一个模型,其中包含部分所需的每个模型的实例。

型号:

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类。

答案 1 :(得分:1)

你有很多选择。首先,您可以创建具有属性

的ViewModel

IEnumerable<TelephoneNumberManagement.Models.TestNumber> TestNumbers

和属性

IEnumerable<TelephoneNumberManagement.Models.Range> Ranges

然后返回一个视图,绑定到新的ViewModel并使用组合数据。

作为替代方案(imho smarter解决方案),您可以将每个视图呈现为子视图@Html.Action("ActionForView1")@Html.Action("ActionForView2")

答案 2 :(得分:1)

您可以使用ViewModel模式来解决此问题。创建一个“ViewModel”,它结合了给定视图所需的所有不同模型和/或表示逻辑。

e.g:

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

然后让你的新组合视图使用ViewModel作为它的模型。

答案 3 :(得分: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等。

希望这不完全取决于你想要完成的事情。

答案 4 :(得分:0)

另一种选择是为您的观点使用动态变量

@model IEnumerable<dynamic>

然后你可以将你想要的任何模型发送给视图,但是你需要明智地使用什么属性。

答案 5 :(得分:0)

如果您希望获得干净的分离,另一个不错的选择是从主视图中使用Html.RenderAction。然后实现为每个描述的视图分离控制器。