将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);
}
答案 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。
只是我猜...