строго типизированные частичные представления MVC RC1

возникла проблема с передачей ViewData.Model в частичные представления. По умолчанию он всегда равен нулю, даже если я приравниваю его к результирующему запросу. Я не могу получить доступ к строго типизированным данным, потому что модель имеет значение null. Мой текущий код таков,

Просмотр страницы

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% Html.RenderPartial("header", this.ViewData.Model); %>
    <% Html.RenderPartial("test", this.ViewData.Model); %>
    <div id="userControls">
    </div>
</asp:Content>

Пользовательский контроль — заголовок

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %>
<h2>
    ACReport</h2>
<p>
    id:
    <%= Html.Encode(Model.id) %>
</p>
<p>
    type:
    <%= Html.Encode(Model.type) %>
</p>

Пользовательский контроль — тест

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<testMVCProject.Models.information>" %>

        <%  using (Ajax.BeginForm(
            "pressureV2",
            "Home",
            new { id = ViewData.Model.id },
            new AjaxOptions
            {
                UpdateTargetId = "userControls",
                HttpMethod = "GET"

            },
            new { @id = "genInfoLinkForm" }))
            {%>
        <%= Html.SubmitButton("hey", "Lol") %>

    <%} %>

Контроллер

public ActionResult header(int id)
        {
            var headerResults = from c in db.information
                                where c.id == id
                                select new information
                                {
                                    id = c.id,
                                    type = c.type
                                };
            ViewData.Model = headerResults.FirstOrDefault();
            return View(ViewData.Model);
        }

public ActionResult pressureV2(int id)
        {
            var pressureVResults = from c in db.pressure_volume_tests
                                   where c.id == id
                                   select new pressureVT
                                   {
                                       bottomCVP = c.bottom_CVP,
                                       topCVP = c.top_CVP
                                   };

            ViewData.Model = pressureVResults.FirstOrDefault();
            return View(ViewData.Model);
        }

person Ayo    schedule 09.03.2009    source источник
comment
Все представления строго типизированы для Models.information? Какой элемент управления возвращает ViewPage?   -  person liammclennan    schedule 10.03.2009
comment
Я не сильно набирал взгляды только частично.   -  person Ayo    schedule 10.03.2009


Ответы (6)


В комментариях вы сказали, что представление не сильно типизировано. Потому что:

<% Html.RenderPartial("header", this.ViewData.Model); %>
<% Html.RenderPartial("test", this.ViewData.Model); %>

не будет работать. Если вы строго вводите свое представление в testMVCProject.Models.information, а затем передаете экземпляр этого типа из своего конструктора, это сработает.

Контроллер:

public ActionResult ShowAView()
{
    Return View("WhateverYourViewIsCalled", new information());
}
person liammclennan    schedule 12.03.2009
comment
так как я использую партиалы во всем своем представлении, если я хочу добавить новую информацию о запросе в партиалы, я ограничен только тем, что передается с самой страницы просмотра, или я могу ограничиться только частью партиала? - person Ayo; 13.03.2009
comment
Частицы могут получать свои данные только из представления. Смотрите ответ Джастина. - person liammclennan; 21.03.2009

У вас неправильное понимание использования помощника Html.RenderPartial. Когда вы используете RenderPartial, вы будете показывать представление, не запрашивая модель у контроллера.

Итак, вам нужно реорганизовать ViewPage и передать хорошую модель своим пользовательским элементам управления:

Пример:

Контроллер:

ActionResult MainView()
{
    var mainviewobj = new MainViewObject();

    var headerResults = from c in db.information
                                where c.id == id
                                select new information
                                {
                                    id = c.id,
                                    type = c.type
                                };

    mainviewobj.info = headerResults.FirstOrDefault();

    return view(mainviewobj);   
}

Код просмотра:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <% Html.RenderPartial("header", this.ViewData.Model.info); %>
    <% Html.RenderPartial("test", this.ViewData.Model.info); %>
    <div id="userControls">
    </div>
</asp:Content>

Посмотреть программный код

public partial class MainView : ViewPage<MainViewObject>
{
}

Теперь модель не будет нулевой в вашем пользовательском контроле. Но помните, что рендеринг пользовательского контроля частично выполняется при выполнении кода в контроллере, поэтому вам не нужен public ActionResult header(int id) в вашем контроллере.

Надеюсь это поможет.

person alexl    schedule 12.03.2009
comment
я пытаюсь избежать файлов кода программной части, и я не уверен, что этот подход будет работать для динамических перегрузок модели. - person Ayo; 13.03.2009

Вы также пытались сделать ViewPage универсальным?

person eulerfx    schedule 12.03.2009

Контроллер не вызывается, когда вы выполняете RenderPartial — он игнорируется, и представление визуализируется напрямую. Поэтому все, что вы хотите передать в качестве модели, должно быть сделано из вызывающего представления.

person Justin    schedule 12.03.2009
comment
откуда вы взяли эту информацию, я уверен, что могу получить доступ к контроллеру при вызове метода renderpartial - person Ayo; 13.03.2009
comment
Из личного опыта. Когда вы вызываете RenderPartial(viewName), механизм представления не будет пытаться вызвать метод контроллера — он будет искать представление с именем viewName. Иди, попробуй... Может быть, тебе удастся переопределить движок просмотра по умолчанию, чтобы использовать контроллеры...? - person Justin; 16.03.2009

Я обнаружил, что это сработало для меня, ссылайтесь на частичное, как и вы, вот так.

...form
    @Html.Partial("_AboutYou", Model.AboutYou);
 ..end form

в частичном виде сверху...

@model <namespace1>.<namespace2>.<namespace3>.CustomerInfo.AboutYou
    @{

        ViewData.TemplateInfo.HtmlFieldPrefix = "AboutYou";

        if (this.ViewContext.FormContext == null)
        {
            this.ViewContext.FormContext = new FormContext();
        }
    }
person Adam    schedule 23.04.2012

Я полагаю, что проблема может заключаться в том, что вам не хватает элемента в форме с именем «id», поэтому параметр метода Action никогда не заполняется значением?

Таким образом, запрос всегда будет возвращать null с FirstOrDefault, следовательно, модель null.

Просто мое предположение...

person antonioh    schedule 12.03.2009