ASP.NET MVC 2: возникают проблемы с созданием представления Master-Detail - PullRequest
1 голос
/ 02 октября 2010

У меня сейчас проблемы с созданием страницы Master-Detail в проекте ASP.NET MVC 2 на данный момент.Этот проект использует Entity Framework OR / M для отображения таблиц.Я использую пользовательский CategoryModel , который передает другой список объектов.Я упростил Модель для презентаций:

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

CategoryDescription - это коллекция описаний на «языке культуры» длякаждый Категория .

Я передаю 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);

После этого я отправляю данные в мое представление, которое, в свою очередь, попытается отобразить PartialView для каждого 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); %>
            <% } %>
            <% 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 over, заключается в том, чтобы не использовать словарь ViewData [] из моей компании.по многим очевидным причинам.

Спасибо за ваше время, люди, и извините за мой английский, я являюсь носителем французского языка из Канады, если опечатки заранее извините!

РЕДАКТИРОВАТЬ 01/10: Причина, по которой существует один RenderPartial вне цикла, заключается в новом поле ввода для добавления содержимого описания, но в методе обратной передачи edit моего контроллера есть логикапозаботиться об этом. RenderPartial внутри цикла позволяет пользователю редактировать существующие описания этой категории.Ключевым моментом здесь является начало работы цикла, я сделал только леса PartialView для целей тестирования, я даже не могу загрузить пустой "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 ]

1 голос
/ 02 октября 2010

Похоже, вы вызываете один и тот же метод частичного рендеринга дважды, передавая его один раз с типом данных 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) %>
0 голосов
/ 04 октября 2010

Спасибо 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 !

...