2010-10-01 95 views
1

現在,我在ASP.NET MVC 2項目中創建主/從頁面時遇到了麻煩。該項目使用實體框架OR/M進行表映射。我正在使用自定義的類別模型正在傳遞另一個對象列表。我已經簡化了型號,以用於演示:ASP.NET MVC 2:創建主詳細視圖時遇到問題

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

在那之後,我送過數據到我的視圖,這反過來會嘗試渲染一個部分視圖我有。這是,我失敗[只有視圖的一部分顯示,顯示類別對象的部分只是精]:

 <%@ 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 []字典由我公司爲許多顯而易見的原因。

感謝您的時間人們,對於我的英語感到抱歉,我是來自加拿大的本地法語發言人,如果有任何錯別字提前抱歉!

編輯01/10:之所以有一個的RenderPartial外循環是用於添加描述內容的新的輸入框,但有邏輯的回傳編輯我的控制器,照顧到方法這個。 RenderPartial循環內部是讓用戶編輯該類別的現有描述。在這裏開始做循環的工作是關鍵,我只是做了一個架式PartialView用於測試目的,我甚至無法加載一個空的「

的Hello World

」如果我通過數據給部分視圖。我將添加在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

這裏有各種各樣的問題。您不能在另一個表單內部創建表單,並且您無法將部分視圖傳遞給它不用於處理的數據類型。您的部分視圖也與您的主視圖類型相同。你的部分視圖需要是'CategoryDe​​scription'類型,你需要刪除第二個渲染部分並以另一種方式實現。 – 2010-10-01 21:30:04

+0

感謝尼克,它幫了很多! =) – LoganWolfer 2010-10-04 13:51:11

回答

0

感謝NickLarsen您的幫助,您的評論幫我找出我在做什麼錯。

我的部分觀點的繼承是問題的原因。

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

是解決我的問題,我真的不明白強類型的意見,這使我周圍遊蕩^^」

至於雙的RenderPartial在我編輯查看,這是需要的,因爲我希望有一個新的數據輸入欄,無論是否已經有數據行類別描述或不。

下面是最終字段集,對於那些誰知道如何我已經做了我的主詳細形式:

 <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) %>