частичный вид с другой viewmodel наследуется - PullRequest
1 голос
/ 07 февраля 2011

У меня есть проект MVC2 с ViewModelBase. У меня есть PartialView, вызываемый masterPage:

<%@ 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);
    }

Это действие вызывает представление, которое содержится на главной странице (которая содержит частичное представление заголовка и т. Д.).

У меня ошибка типа, не могли бы вы мне помочь? Как я могу передать ViewModelBannerFront в моем последнем PartialView? Заранее спасибо

1 Ответ

2 голосов
/ 07 февраля 2011

Pat,

Вместо того, чтобы запускать renderpartial, попробуйте выполнить следующее, и оно должно работать:

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

причина, по которой <% Html.RenderPartial("~/Views/Shared/Controls/BannerFront.ascx"); %> не работает, связана с тем, чточто модель передается непосредственно из модели родительского представления (т. е. 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); %>

и т. д. и т. д. Надеюсь, что это имеет смысл.

см. эту ссылку, чтобы ближе познакомиться с рендерингом и рендерингом:

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

...