Установка masterName в представлении MVC вызывает ошибку при вызове RenderAction - PullRequest
0 голосов
/ 03 марта 2011

У меня есть мастер-страница (site.master), которая вызывает представление с использованием RenderAction.На данный момент вид возвращает «привет мир».

site.master:

<%@ Master Language="C#" Inherits="System.Web.Mvc.ViewMasterPage" %>

<html>
<head id="Head1" runat="server">
   <title><asp:ContentPlaceHolder ID="ContentPlaceHolder1" runat="server" /></title>
   <asp:ContentPlaceHolder ID="ContentPlaceHolder2" runat="server" />
</head>

<body>
    <% Html.RenderAction("Test", "Charts"); %>

    <asp:ContentPlaceHolder ID="ContentPlaceHolder3" runat="server" >
      <p>site.master</p>
    </asp:ContentPlaceHolder>

    <asp:ContentPlaceHolder ID="ContentPlaceHolder4" runat="server" />  
</body>
</html>

Test.aspx:

<%@ Page Language="C#" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

hello world!

ChartsController.cs:

public ActionResult Test()
{
    return View();
}

Если я обновлю представлениечтобы передать имя главной страницы явно, я получаю сообщение об ошибке при вызове RenderAction.

ChartsController.cs:

public ActionResult Test()
{
    return View(null, "site");
}

Ошибка:

Должны быть элементы управления контентомэлементы управления верхнего уровня на странице содержимого или вложенной главной странице, которая ссылается на главную страницу.

Stack Trace:

[HttpException (0x80004005): Content controls have to be top-level controls in a content page or a nested master page that references a master page.]
   System.Web.UI.MasterPage.CreateMaster(TemplateControl owner, HttpContext context, VirtualPath masterPageFile, IDictionary contentTemplateCollection) +8857854
   System.Web.UI.Page.get_Master() +54
   System.Web.UI.Page.ApplyMasterPage() +15
   System.Web.UI.Page.PerformPreInit() +45
   System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +328

Как мне настроить главную страницу, которую я хочу использовать для представления?В конечном итоге я буду устанавливать мастер-страницу динамически с помощью пользовательского ViewEngine (переопределяя VirtualPathProviderViewEngine.FindView).

if ( String.IsNullOrEmpty(masterName) ){ masterName = "site"; }

Когда я устанавливаю свойство masterName в моем ViewEngine, а затем вызываю RenderAction из site.master, я получаю то же самоеошибка, как при установке свойства masterName в действии.

Я использую:
Visual Studio 2010
MVC 3
IIS Express

отредактировано: добавлен полный сайт.мастер разметки

Ответы [ 2 ]

0 голосов
/ 03 марта 2011

Я нашел решение и, по крайней мере, частичный ответ / понимание причины моей проблемы.

Если я прав, проблема заключается в том, что я пытаюсь установить мастер-страницу в представлении, котороене было / нужна мастер-страница.Я думаю, что результатом было то, что я устанавливал путь к мастер-странице, и хотя эта мастер-страница существует, представление не ожидало его и из-за ошибки.

Когда я обновил представление, чтобы использовать мастер-страницу, я смогпередать имя главной страницы непосредственно в представление без ошибки.

Test.aspx:

<%@ Page Language="C#" MasterPageFile="~/Views/Shared/Charts.Master" Inherits="System.Web.Mvc.ViewPage<dynamic>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server">
    hello world!
</asp:Content>

Способ, которым я решил эту проблему в моем пользовательском ViewEngine, заключался в проверке текущегоПредставление является ChildAction.

if (String.IsNullOrEmpty(masterName) && !controllerContext.IsChildAction)
{
    masterName = "site";
}
0 голосов
/ 03 марта 2011

Подкласс ViewPage<T> и переопределить событие OnPreInit().В вашем переопределении

protected override void OnPreInit(EventArgs e)
{
    this.MasterLocation = GetMasterLocation();
    base.OnPreInit(e);
}

Метод GetMasterLocation() должен получить имя файла представления (начиная с "~/").

Ошибка возникает из-за метода CreateMaster в MasterPage, код, который его выдает:

if (masterPageFile == null)
{
    if ((contentTemplateCollection != null) && (contentTemplateCollection.Count > 0))
    {
        throw new HttpException(SR.GetString("Content_only_allowed_in_content_page"));
    }
    return null;
}

Итак, MasterPage не существует, и коллекция шаблонов контента имеет шаблоныТаким образом, страница выдает исключение.Следуя приведенным выше инструкциям, программно установите местоположение главной страницы (которая обрабатывается в виртуальном пути, который является переменной masterPageFile)

...