1

我在 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);
    }

在这里它工作正常并在局部视图中传递模型二,您可以在局部视图中使用它,但现在我将模型一传递给我的局部视图,它工作正常但是当我想将模型二传递到我的主视图并更改主控制器时对此:

  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'.

我该如何处理?

4

3 回答 3

5

最好的方法是拥有一个包含其他模型作为属性的第三个模型 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
于 2013-06-28T19:48:51.467 回答
1

在我的布局中只需要

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

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

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

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

于 2013-06-28T20:09:52.157 回答
1

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

于 2013-06-28T19:08:35.500 回答