我在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'.
我该如何处理?
答案 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);
}
现在你可以将模型传递给你的部分并在主布局中渲染它,你可以在你的主动作中使用不同的模型