1

我有一个ViewModelBase的MVC2项目。 我有一个由母版被称为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需要ViewModelBannerFront继承ViewModelBase:

<%@ 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? 预先感谢您

回答

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)传递。这意味着你不要通过控制器运行代码,而是直接调用partial,并由父视图模型填充。鉴于所需的视图类型(在局部视图中)是ViewModelBannerFront,这里就存在这个问题。

攻击问题的另一种方法是组合您的视图模型,以包含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

+0

感谢您的回答,但我的旗帜是一个简单的视图用户控件,它没有控制器。这是否意味着我必须为我的BannerFront.ascx创建一个? – PatachouNewG 2011-02-07 12:43:56