我现在在ASP.NET MVC 2项目中创建Master-Detail页面时遇到了麻烦。该项目使用Entity Framework OR / M进行表映射。我正在使用自定义 CategoryModel ,它会传递另一个对象列表。我为演示目的简化了模型:
public class CategoryModel {
public Category Category { get; set; }
public IEnumerable<CategoryDescription> CategoryDescriptions { get; set; }
}
CategoryDescription 是每个 类别 的“基于文化语言”描述的集合。
我正在将 CategoryModel 传递给我的控制器[同样,控制器编辑方法已经过简化以用于演示目的]:
// CategoryModel constructor
CategoryModel categoryModel = new CategoryModel()
{
Category = (from c in bo.Categories where c.CategoryID == categoryId select c) as Category,
CategoryDescriptions = bo.CategoryDescriptions.Where(p => p.CategoryID == categoryId).OrderBy(p => p.Language == "en")
};
return View(categoryModel);
之后,我将数据发送到我的视图,然后该视图将尝试为每个 CategoryDescription 呈现 PartialView 我有。这是我失败的地方 [仅显示部分视图,显示 类别 对象的部分正常]:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<InnVue.Globe.Models.CategoryModel>" %>
<%@ Import Namespace="InnVue.Globe.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
<%: ViewContext.RouteData.Values["Action"] %> Category
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%: ViewContext.RouteData.Values["Action"] %> Category</h2>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>CategoryDescription</legend>
<% foreach (var catdes in Model.CategoryDescriptions) { %>
<% Html.RenderPartial("CategoryDescriptions", catdes); %>
<% } %>
<% Html.RenderPartial("CategoryDescriptions", Model.CategoryDescriptions, new ViewDataDictionary()); %>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
我现在遇到的问题来自 RenderPartial 方法,每当我尝试通过它传递数据时,我的应用程序都会崩溃。
我确实尝试将Inherits标记更改为多种类型,似乎没有解决问题。如果我没有使用 RenderPartial htmlhelper 方法传递任何数据,则页面加载就好了。
我在论坛板上尝试了几个建议,但我找不到解决这个问题的答案。我在此处用于提取 PartialView 中的数据的唯一限制是不使用 ViewData []我公司的字典有很多明显的原因。
感谢您的时间,感谢您的英语,我是来自加拿大的母语为法语的人,如果有任何错误提前抱歉!
编辑01/10:循环外有一个 RenderPartial 的原因是用于添加描述内容的新输入框,但回发中有逻辑编辑我的控制器的方法来处理这个问题。循环中的 RenderPartial 可让用户编辑该类别的现有描述。开始使循环工作是关键,我只是为了测试目的而做了一个支架 PartialView ,我甚至无法加载一个空的“ < / em>
Hello World
“如果我将数据传递到 PartialView 。我将添加 PartialView 的代码,即使我不确定它应该继承哪个类:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryModel>" %>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>Fields</legend>
<p>Hello World !</p>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
答案 0 :(得分:1)
看起来你正在调用相同的渲染部分方法两次,使用数据类型CategoryDescription
传递一次,然后再传递一个类型为IEnumerable<CategoryDescription>
的模型。您是否尝试过评出未通过视图的正确数据类型的那个?
尝试这样的事情:
<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage<InnVue.Globe.Models.CategoryModel>" %>
<%@ Import Namespace="InnVue.Globe.Models" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
<%: ViewContext.RouteData.Values["Action"] %> Category
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<h2><%: ViewContext.RouteData.Values["Action"] %> Category</h2>
<% Html.EnableClientValidation(); %>
<% using (Html.BeginForm()) {%>
<%: Html.ValidationSummary(true) %>
<fieldset>
<legend>CategoryDescription</legend>
<% foreach (var catdes in Model.CategoryDescriptions) { %>
<% Html.RenderPartial("CategoryDescriptions", catdes); %>
<% } %>
<p>
<input type="submit" value="Save" />
</p>
</fieldset>
<% } %>
<div>
<%: Html.ActionLink("Back to List", "Index") %>
</div>
</asp:Content>
并将其用作部分视图:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryModel>" %>
<%: Html.EditorFor(m => m) %>
答案 1 :(得分:0)
感谢 NickLarsen 的帮助,你的评论让我弄清楚我做错了什么。
部分视图的继承 是问题的原因。
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryDescription>" %>
解决了我的问题,我并没有真正理解强烈的类型观点,这让我漫无目的地漫游^^'
至于我的 编辑 视图中的双 RenderPartial ,这是必需的,因为我想为新数据输入设置一个新字段无论 CategoryDescription 上是否已有数据行。
这是最终的字段集,适用于那些想知道我是如何完成 Master-Detail 表单的人:
<fieldset>
<legend>CategoryDescription</legend>
<% foreach (var catdes in Model.CategoryDescriptions) { %>
<% Html.RenderPartial("CategoryDescription", catdes); %>
<% } %>
<%
CategoryDescription emptyCatDes = new CategoryDescription();
Html.RenderPartial("CategoryDescription", emptyCatDes, new ViewDataDictionary()); %>
</fieldset>
我还不知道它是否100%有效,但所有信息现在都在我的视图中正确显示。
祝大家好运,再次感谢帮助 NickLarsen !