2010-10-01 3 views
1

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

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 для каждого КатегорияDescription У меня есть. Это где я неудачу [Только часть вида показана та часть, показывающая Категория объект просто отлично]:

 <%@ 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 тег к нескольким типам, как представляется, не решить эту проблему. Если я не передаю какие-либо данные, используя RenderPartialhtmlhelper метод, страница загружается просто отлично.

Я пробовал несколько предложений над досками на форуме, но я не мог найти ответ, чтобы решить эту проблему. Единственное ограничение я здесь для вытягивать данные в PartialView за кадром, чтобы не использовать ViewData [] словарь из моей компании по многим очевидным причинам.

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

EDIT 01/10: Причина, почему есть один RenderPartial вне цикла для нового ввода для добавления контента описания, но есть логика в постбэка редактировать метод моего контроллера, чтобы заботиться о это. RenderPartial внутри цикла есть, чтобы позволить пользователю редактировать существующие описания этой категории.Начиная сделать работу цикла является ключом здесь, я только сделал scaffolded 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> 
+0

У вас здесь есть всевозможные проблемы. Вы не можете иметь форму внутри другой формы, и вы не можете передать частичный вид, тип данных, который он не предназначен для обработки. Ваш частичный вид также имеет тот же тип, что и ваш основной вид. Ваше частичное представление должно быть типа 'CategoryDescription', и вам нужно удалить второй частичный рендеринг и реализовать его другим способом. –

+0

Спасибо, Ник, это очень помогло! знак равно – LoganWolfer

ответ

0

Благодаря NickLarsen за вашу помощь, ваш комментарий помог мне понять, что я делаю неправильно ,

Наследование моего частичного вида был причиной этой проблемы.

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

ли решение моей проблемы, я не очень понял, строго типизированные взгляды, и это привело меня бродить бесцельно ^^

Что касается двойного RenderPartial в моей Редактировать View, это необходимо, так как я хочу, чтобы новое поле для ввода новых данных не имело значения, если есть уже строки данных на КатегорияDescription или нет.

Вот окончательный FIELDSET, для тех, кто задается вопросом, как я сделал мой 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!

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) %> 
Смежные вопросы