如何将两个模型传递给我的视图一个到局部一个到主视图?

时间:2013-06-28 19:04:23

标签: asp.net-mvc-3

我在mvc3上开发了一个简单的Web应用程序,我有一个主布局,它包含一个局部视图,我有一个包含主布局的主视图。

我想在我的视图中传递两个模型,一个模型到局部视图,一个模型到主视图。

这可能是主人布局:

  @Html.Partial("_PartialMaster")
  @{Html.RenderAction("paction", "Home");}
  <div>
     @RenderBody()
  </div>

和我的部分观点:

@model test.Models.MyModel1
<div>
  @Html.ValueFor(m=>m.value1)
</div>

我的模特:

public class Model1
 {
    public string value1 { get; set; }
 }

public class Model2
 {
    public string value2 { get; set; }
 }

这些是我的行动:

  public ActionResult Index()
    {          
        return View();
    }

    public PartialViewResult paction()
    {
        Model2 m2 =new Model2();
        m2.value1="123";
        return PartialView("_PartialMaster",m2);
    }

这里它工作正常,并在局部视图中传递模型2,你可以在局部视图中使用它但现在在这里我模型一到我的局部视图,它工作正常,但当我想将模型二传递到我的家庭视图和将家庭控制器更改为:

  public ActionResult Index()
    {
        Model1 m1 = new Model();
        m1.value1 = "abc"; 

        return View(m1);
    }

它出错:

The model item passed into the dictionary is of type 'test.Models.Model2', but this   
dictionary requires a model item of type 'test.Models.Model'.

我该如何处理?

3 个答案:

答案 0 :(得分:5)

最好的方法是使用包含其他模型作为属性的第3个模型AKA ViewModel。因此,假设所有模型都驻留在名称空间projectName.ViewModels中:

namespace projectName.ViewModels
{
   public class ViewModel
   {
      public Model1 ModelA { get; set; }
      public Model2 ModelB { get; set; }
   }
}

一旦你有了这个,你就可以在你的控制器动作中填充你的模型:

public ActionResult Index()
{
    var model = new ViewModel();
    model.Model1 = new Model1 {value1 = "XYZ"};
    model.Model2 = new Model2 {value2 = "ABC"};    
    return View(model);
}

然后您的索引视图将采用ViewModel作为其模型类型:

@model = projectName.ViewModels.ViewModel

并且您可以在“索引”视图中使用模型的任何属性,例如:

<div>@Model.Model1.Value1</div>
<div>@Model.Model2.Value2</div>

如果你需要通过,让我们说Model2到你的局部视图,那么你所要做的就是:

@Html.Partial("_partialViewName", Model.Model2)

确保您的局部视图采用Model2的类型:

@model = projectName.ViewModels.Model2

答案 1 :(得分:1)

您可以在主页面的顶部包含两个@Model指令,而部分仍然可以访问它们。我们相信。

答案 2 :(得分:1)

在我的布局中只需要

 @{Html.RenderAction("paction", "Home");}

并将模型传递给部分需要:

 public PartialViewResult paction()
    {
        Model2 m2 = new Model2();
        m2.value1 = "123";
        return PartialView("_PartialMaster", m2);
    }

现在你可以将模型传递给你的部分并在主布局中渲染它,你可以在你的主动作中使用不同的模型