1

我现在在 ASP.NET MVC 2 项目中创建主从页面时遇到了麻烦。本项目使用实体框架 OR/M 进行表映射。我正在使用一个自定义CategoryModel,它正在传递另一个对象列表。为了演示目的,我简化了模型:

    public class CategoryModel {
    public Category Category { get; set; }
    public IEnumerable<CategoryDescription> CategoryDescriptions { get; set; }
    }

CategoryDe​​scription是每个Category的“基于文化语言的”描述的集合。

我将CategoryModel传递给我的控制器 [再次,出于演示目的,控制器Edit方法已被简化]:

        // 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);

之后,我将数据发送到我的视图,然后它会尝试为我拥有的每个CategoryDe ​​scription 呈现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用于测试目的,我什至不能加载一个空的“

你好世界

“如果我将数据传递给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>
4

2 回答 2

1

看来您两次调用相同的渲染部分方法,一次将其传递给数据类型CategoryDescription,另一次将其传递给具有 type 的模型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) %>
于 2010-10-01T21:06:44.773 回答
0

感谢NickLarsen的帮助,您的评论帮助我弄清楚我做错了什么。

我的部分观点的继承是问题的原因。

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<InnVue.Globe.Models.CategoryDescription>" %>

是我的问题的解决方案,我不是很了解强类型视图,导致我漫无目的地闲逛^^'

至于我的编辑视图中的双RenderPartial,这是必需的,因为无论CategoryDe ​​scription 上是否已有数据行,我都希望有一个新字段用于新数据输入。

这是最后的字段集,对于那些想知道我是如何完成我的主从表单的人:

        <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% 有效,但所有信息现在都在我的View中正确显示。

祝大家好运,再次感谢NickLarsen的帮助!

于 2010-10-04T13:50:17.167 回答