我有一个带有ViewModelBase的MVC2项目。 我有一个由masterPage调用的PartialView:
<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage<MyProject.Web.FrontOffice.Models.ViewModels.ViewModelBase>" %>
<% Html.RenderPartial("~/Views/Shared/Controls/Header.ascx"); %>
此PartialView还调用PartialView:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<MyProject.Web.FrontOffice.Models.ViewModels.ViewModelBase>" %>
<% Html.RenderPartial("~/Views/Shared/Controls/BannerFront.ascx"); %>
最后一个PartialView需要一个继承ViewModelBase的ViewModelBannerFront:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<Curioos.Web.FrontOffice.Models.ViewModels.ViewModelBannerFront>" %>
我认为继承,没有问题,我在控制器中设置了ViewModelBannerFront:
public ActionResult Index(string username)
{
//other stuff
ViewModelBannerFront vmbf = new ViewModelBannerFront();
return View(vmbf);
}
此操作调用包含在母版页中的视图(其中包含标题部分视图等...)。
我有类型错误,你能帮帮我吗? 如何在我的上一个PartialView中传递ViewModelBannerFront? 提前谢谢
答案 0 :(得分:2)
专利,
尝试执行以下操作,而不是运行renderpartial,它应该可以工作:
// assuming that your banner controller is called BannerFrontController
<%Html.RenderAction("Index", "BannerFront"); %>
<% Html.RenderPartial("~/Views/Shared/Controls/BannerFront.ascx"); %>
不起作用的原因是由于在作为partialview调用时直接从父视图模型(即MyProject.Web.FrontOffice.Models.ViewModels.ViewModelBase
)传递模型的事实。这意味着您不通过控制器运行代码,而是直接调用部分并由父视图模型填充。鉴于所需的视图类型(在部分视图中)是ViewModelBannerFront
,这就是问题所在。
解决问题的另一种方法是编写viewmodel,以便同时包含ViewModelBase和ViewModelBannerFront。然后,只需按以下方式调用局部视图:
// no need to call entire path as views are in shared folder
<% Html.RenderPartial("Header", Model.ViewModelBase); %>
<% Html.RenderPartial("BannerFront", Model.ViewModelBannerFront); %>
等等。希望这是有道理的。
请参阅此链接以更深入地了解renderpartial vs renderaction:
http://devlicio.us/blogs/derik_whittaker/archive/2008/11/24/renderpartial-vs-renderaction.aspx