строго типизированные частичные представления MVC RC1 - PullRequest
0 голосов
/ 09 марта 2009

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

ViewPage

<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>

UserControl - заголовок

<%@ 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>

UserControl - тест

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

Ответы [ 6 ]

2 голосов
/ 13 марта 2009

В комментариях вы сказали, что представление не является строго типизированным. Из-за этого:

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

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

Контроллер:

public ActionResult ShowAView()
{
    Return View("WhateverYourViewIsCalled", new information());
}
1 голос
/ 13 марта 2009

Вы неправильно понимаете, как использовать помощник Html.RenderPartial. При использовании RenderPartial вы будете отображать представление без запроса модели из контроллера.

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

Exemple:

Контроллер:

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>
{
}

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

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

0 голосов
/ 24 апреля 2012

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

...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();
        }
    }
0 голосов
/ 13 марта 2009

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

0 голосов
/ 12 марта 2009

Вы также пытались сделать общий вид ViewPage?

0 голосов
/ 12 марта 2009

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

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

Только мое предположение ...

...