ASP.NET MVC 2:创建主 - 详细视图时遇到问题

时间:2010-10-01 20:44:21

标签: c# asp.net-mvc-2 model renderpartial master-detail

我现在在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; }
    }

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

我正在将 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);

之后,我将数据发送到我的视图,然后该视图将尝试为每个 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 ,我甚至无法加载一个空的“ < / 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>

2 个答案:

答案 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 ,这是必需的,因为我想为新数据输入设置一个新字段无论 CategoryDe​​scription 上是否已有数据行。

这是最终的字段集,适用于那些想知道我是如何完成 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