【问题标题】:partial view with different viewmodel inherited继承了不同视图模型的局部视图
【发布时间】:2011-02-07 10:44:32
【问题描述】:

我有一个带有 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? 提前谢谢你

【问题讨论】:

    标签: .net inheritance asp.net-mvc-2 viewmodel asp.net-mvc-partialview


    【解决方案1】:

    帕特,

    与其运行部分渲染,不如尝试执行以下操作,它应该可以工作:

    // assuming that your banner controller is called BannerFrontController
    <%Html.RenderAction("Index", "BannerFront"); %>
    

    &lt;% Html.RenderPartial("~/Views/Shared/Controls/BannerFront.ascx"); %&gt; 不起作用的原因是模型在作为局部视图调用时直接从父视图模型(即MyProject.Web.FrontOffice.Models.ViewModels.ViewModelBase)传递。这意味着您不通过控制器运行代码,而是直接调用部分代码并由父视图模型填充。鉴于所需的视图类型(在部分视图中)是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 与 renderaction:

    http://devlicio.us/blogs/derik_whittaker/archive/2008/11/24/renderpartial-vs-renderaction.aspx

    【讨论】:

    • 感谢您的回答,但我的横幅是一个简单的视图用户控件,它没有控制器。这是否意味着我必须为我的 BannerFront.ascx 创建一个?
    • 拍,不,但你确实遇到了不匹配的强类型的问题。您需要有一个复合视图模型,其中包含 ViewModelBase 和 ViewModelBannerFront 才能根据您上面所说的进行工作。
    • 所以继承不起作用......我应该把我的 BannerFront 放在每一页......这就是我想要避免的......
    猜你喜欢
    • 1970-01-01
    • 2019-01-27
    • 2015-06-21
    • 1970-01-01
    • 2014-03-15
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多