强类型部分视图MVC RC1

时间:2009-03-09 14:28:24

标签: asp.net-mvc user-controls strong-typing viewdata partials

将ViewData.Model传递给部分视图时出现问题。即使我将其等同于结果查询,它也总是默认为null。我无法访问强类型数据,因为Model为null。我目前的代码就是这个,

的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 个答案:

答案 0 :(得分:2)

在评论中,您说视图不是强类型的。因为:

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

不起作用。如果您强烈键入testMVCProject.Models.information的视图,然后从构造函数中传递该类型的实例,它将起作用。

控制器:

public ActionResult ShowAView()
{
    Return View("WhateverYourViewIsCalled", new information());
}

答案 1 :(得分:1)

您对Html.RenderPartial助手的使用存在误解。 使用RenderPartial时,您将显示视图而无需从控制器请求模型。

所以你必须重构你的ViewPage并将好的Model传递给你的用户控件:

例:

控制器:

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中的Model不会为null。 但请记住,usercontrol渲染部分执行控制器中的代码 因此,您需要控制器中的public ActionResult header(int id)

希望这有帮助。

答案 2 :(得分:0)

你是否尝试过使用ViewPage?

答案 3 :(得分:0)

当您使用RenderPartial时,不会调用Controller - 它被绕过并直接呈现视图。因此,无论您想要传递什么模型都需要从调用View中完成。

答案 4 :(得分:0)

我发现这对我有用,像你一样参考部分,就像这样。

...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();
        }
    }

答案 5 :(得分:-1)

我认为问题可能是您在表单中缺少名为“id”的元素,因此Action方法的参数永远不会填充值?

这样查询将始终使用FirstOrDefault返回null,因此为null Model。

只是我猜...